Assembly 无法使汇编程序正确检查数字

Assembly 无法使汇编程序正确检查数字,assembly,Assembly,我正试图编写一个汇编语言程序,读入一个数字并将其与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

我正试图编写一个汇编语言程序,读入一个数字并将其与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进行编译。有人知道这意味着什么吗?
对于所有的基本问题,我深表歉意。这是我第一次处理汇编语言,并且发现它非常困难…

您的代码包含:

sub dx, 30h
这将从字符的ASCII代码中减去
48
(ASCII
0

但您的代码也包含以下行:

cmp dx, '5'   ;compare entered nnumber to 5
它将字符的ASCII值与减去的值进行比较

您使用的函数(
0x0A
)正在捕获缓冲输入,因此数据不会放在
DX
,而是放在
ES: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
您可能对可以找到的具体函数参考感兴趣

现在,由于引用了
5
,这可能只是与ASCII字符
5
(35H)比较,而不是与值5比较


我很想删除那些引号。

在代码中间声明你的输入缓冲区可能不是一个好主意。把它放在你跳过的区域,或者在<代码>章节中。BSS < /C> 需要对
int 21h/0Ah
的缓冲区进行特殊格式化。第一个字节是要接受的最大字符数。将其设置为至少2个,并且不超过缓冲区中实际容纳的字符数。第二个字节将包含实际输入的字符数。计数将包括结束输入的CR…和它将在缓冲区中

输入的实际文本将从
[buffer+2]
开始。不幸的是
[dx+2]
在16位代码中不是有效地址。使用
bx
si
di
进行寻址。已经讨论了
5
'5'
之间的差异


您可能不需要“缓冲输入”“如果只需要一个字符,请打断。拉尔夫·布朗的打断名单是你的朋友

逐步检查代码。请注意指令指针的位置,以及使用code
0ah
调用
int 21h
后发生的情况。另外,请更仔细地阅读代码
0ah
的文档。通过使用代码格式,将每个汇编指令放在自己的行上,并清楚地分隔注释,可以使代码更具可读性吗?谢谢您的详细回答。使用01而不是0ah函数是否更好?很可能。这样,您就不需要缓冲区,并且可以逐个字符地处理,而不是等待CR。
  cmp dx, '5'   ;compare entered nnumber to 5