2016-03-31 5 views
-1

を使用してそれは、charを取り、私はpollcount_putc(char)に呼ばれて、このアセンブリ関数を記述する必要がx86のアセンブリ

をCOM2 THREとpollcountをカウントし、COM2 THREの多くのテストは、ポーリングループ内で行われる方法をカウントし、 COM2に出力します。今私は0をすべて受け取っているので、間違ったことをしています。誰もが私のロジックの問題はそれは素晴らしいことだどこにどのような考えを持っている場合

#Function call is pollcount_putc(c[i]) 
#COM2 base address is 0x2f8 
.text 
.globl _pollcount_putc 
COMTWO = 0x2f8 

_pollcount_putc: 

    movl 4(%esp), %ecx #get character 
    movl $COMTWO, %edx #set port address 
    addl $5, %edx #get to LSR 
    movl $0, %ebx #set counter to 0 

loop: 
    inb (%dx), %al #read in LSR byte 
    andb $0x01, %al #isolate DR bit 
    jz loop #if zero or not ready loop until 
    movw $COMTWO, %dx #Reset dx with correct com address 

comaddress: 
    movb %cl, %al #move char input to output 
    outb %al, (%dx) #output the char taken in 
    addl $5, %edx #move back to LSR byte 
countloop: 
    incl %ebx #increment count 
    inb (%dx), %al #read from LSR byte to get thre 
    andb $0x20, %al #mask to look at thre 
    jz countloop #if tx hr empty 
end: 
    movl %ebx, %eax #set counter to eax return register 
    ret 
    .end 

:ここ

は、以下のコードです。私はこのことをまったくやっているのかどうかはわかりません。

更新:私はこれがうまくいって、上のコードは新しいです。カップルの日に私はそれを閉じるために以下の答えを投稿します。

+1

適切なアセンブリコードを書くの秘密の90%は、すべての*ステートメントに良いコメントを付けることです。そして、「取り戻す」ではなく、それが何をするかの論理的な記述。あなたは絶望的に失われた正確なポイントでコメントを終了します。コメントを書くことができない場合、必然的に正しいコードを書くことはできません。誰もあなたが思っていたものを見ることができないので、助けてください。 –

+0

コメント付きの更新されたコードを投稿します。あなたが間違っていない間もあなたのコメントは役に立ちませんでした。 – Peter3

答えて

-1

あなたのc [i]は4バイトありますか?そうでない場合は、4(%esp)を使用してメモリの場所を取得しないでください。

+0

その部分は実際には正しいです。スタックポインタは4バイトの情報を消費し、次にそれを渡したcharが次にスタックするので、スタックポインタに4を加えてその内容を取得するのはなぜですか。 – Peter3

関連する問題