0

数値を読み取って 5 と比較するアセンブリ言語プログラムを作成しようとしています。数値が 5 未満の場合、プログラムは正常に終了するはずです。何をしても、正常に終了しないようです。常にエラーラベルにジャンプします。

私のコード:

bits 16
org 0x100   ;start at offset 100
jmp main

buffer:   db 4  ; define 4 bytes
      db 0  ; actual number of characters entered

msg:      db "Enter a number between 0 and 5 ", 0ah, 0dh, '$' ; define bytes for message

ermsg:    db "The number must be between 0 and 5", 0ah, 0dh, '$';error message if number is too large

main:
dsp_msg:  mov ah, 09    ; screen display
      mov dx, msg   ; mov starting address of msg into dx 
      int 21h   ; display message

in_buff:      resb 20   ; reserve 20 bytes
      mov ah, 0ah   ; service read character
      mov dx, buffer ;move address of parameter block to dx
      int 21h   ;bios system call
      sub dx, 30h

chk_num:  
      cmp dx, '5'   ;compare entered nnumber to 5
      jge err   ;if entered value is greater or equal to 5 jump to err
      jb fin    ;if entered number is below 5 jump to fin

err:      mov ah, 09    ;
      mov dx, ermsg ;move ermsg to dx
      int 21h   ;display error message
      jmp in_buff     

fin:      int 20h

私が間違っていることはありますか?

"アップデート:

01 関数を使用するようにコードを変更しました
が、「操作サイズが指定されていません」というエラー メッセージが表示され続けます。

私の新しいコード:

bits 16
org 0x100   ;start at offset 100
jmp main

buffer:   db 4  ; define 4 bytes
db 0    ; actual number of characters entered

msg: db "0 から 5 までの数字を入力してください", 0ah, 0dh, '$' ; メッセージのバイトを定義する

ermsg:    db "The number must be between 0 and 5", 0ah, 0dh, '$';error message if number is too large

main:
dsp_msg:  mov ah, 09    ; screen display
mov dx, msg ; mov starting address of msg into dx 
int 21h ; display message

in_buff:  resb 20   ; reserve 20 bytes
mov ah, 01  ; service read character
mov dx, buffer;move address of parameter block to dx
int 21h ;dos system call

chk_num:  
cmp [dx], 5 ;compare entered nnumber to 5
jge err ;if entered value is greater or equal to 5 jump to err
jb fin  ;if entered number is below 5 jump to fin

err:      mov ah, 09    ;
mov dx, ermsg   ;move ermsg to dx
int 21h ;display error message
jmp in_buff   

fin:      int 20h  

コンパイルにはnasmを使用しています。誰かがそれが何を意味するか知っていますか?
基本的な質問ばかりで申し訳ありません。アセンブリ言語を扱うのはこれが初めてで、非常に難しいと感じています...

4

3 に答える 3

1

あなたのコードには以下が含まれています:

sub dx, 30h

これは、文字の ASCII コードから48(ASCII ) を減算します。0

ただし、コードには次の行も含まれています。

cmp dx, '5'   ;compare entered nnumber to 5

文字の ASCII 値と減算された値を比較します。

使用する関数 ( 0x0A) はバッファリングされた入力をキャプチャしているため、データは ではなく に配置さDXES:DXます。単に削除sub dx, 30hしてレジスタ値を比較するのではなく、そこにあるデータを比較します。

mov ah, 0ah   ; service read character
mov dx, buffer ;move address of parameter block to dx
int 21h       ;bios system call

chk_num:  
    cmp byte [es:dx+2], '5'   ;compare entered number to 5

ところで、メッセージのデータを書き換えるので、バッファは次のようになります。

buffer:   
    db 4  ;this buffer will be 4 bytes long
    db 0  ;well, we don't know how many characters are going to be entered, so `0` will be the best
    dd 0  ;and now the promised 4 bytes for buffer contents

ここにある具体的な関数リファレンスに興味があるかもしれません。

于 2013-09-17T16:47:48.790 に答える
0
  cmp dx, '5'   ;compare entered nnumber to 5

が引用符で囲まれているため、値 5 ではなく5ASCII 文字5(35H) と比較される可能性があります。

そこにある引用符を削除したくなるでしょう。

于 2013-09-17T16:47:57.853 に答える