0

私は次のasmコード(x86)を持っています。

.input:
mov ah, 00h         ; get key from keyboard buffer
int 16h         ; interrupt 16h 
mov dl, al      ; move ASCII code into dl
mov ah, 02h     ; function 02
int 21h         ; interrupt 21h
mov ah, 0Eh     ; tell the BIOS to print the character in the AL register
mov al, dl      ; copy dl into al
int 10h         ; print al
sub al,0Dh      ; check if it's carriage return
jz 01h          ; jump relative 1 (to skip newLine)
call newLine        ; add CR LF
jmp .input      ; loop

ただし、ゼロ命令が期待どおりに機能していない(期待されている)場合のジャンプ、つまりjz01h。

newLineサブルーチンの呼び出しを飛び越えるために、相対1命令をジャンプ(またはIPに1つ追加)したいと思います。

現在、エンターキーを押してjz命令が呼び出されると、プログラムの早い段階でコードが実行されるため、プログラムは絶対的にジャンプしていると思います。

何か案は?

ありがとう、スティーブ

4

2 に答える 2

5

Jump 01hは、命令ではなくバイトをカウントするため、実際には呼び出しをスキップしません。呼び出し命令は複数のバイトで構成されます。jz .afterCallのように、ジャンプできる呼び出しの後に別のラベルを追加してみませんか?

于 2012-04-12T16:47:22.010 に答える
1

どうですか

jz _no_newLine      ; jump 
call newLine        ; add CR LF
_no_newLine:
jmp .input          ; loop
于 2012-04-12T16:48:18.940 に答える