【发布时间】:2013-09-17 16:30:17
【问题描述】:
我正在尝试编写一个汇编语言程序,它读取一个数字并将其与 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 进行编译。有谁知道这是什么意思?
对不起所有的基本问题。这是我第一次处理汇编语言并发现它非常困难......
【问题讨论】:
-
单步执行您的代码。注意指令指针的去向以及使用代码
0ah调用int 21h后会发生什么。另外,请更仔细地阅读代码0ah的文档。 -
您能否通过使用代码格式化、将每条汇编指令放在自己的行中并清楚地分隔 cmets 来使您的代码更具可读性?
标签: assembly