汇编初学者一个问题不明白,请教一下

ww884203 2011-11-08 12:13:21
我想实现检查输入的字符是不是16进制数(也就是0-9a-zA-Z)
可是每次一输入就弹出ntvdm cpu 之类的东西,但是如果我在输入后面增加一个输出的话就不会遇到这样的情况,我是初学者不知道问题出在哪里,请大家帮忙指出错误在哪里,谢谢!

;*******************************************************************
data segment
error_msg db 'Your input is not correct!','$'
data ends
;-------------------------------------------------------------------
stack segment para stack 'stack'
db 20 dup(?)
stack ends
;*******************************************************************
code segment
;-------------------------------------------------------------------
main proc far
assume cs:code , ds:data , ss:stack
start:
mov ax , data
mov ds , ax
mov ax , stack
mov ss , ax
mov sp , 20
mov dx , offset input_first
mov ah , 9h
int 21h
mov ah , 01h
int 21h
call check_if_right
jmp exit

check_if_right:
cmp al , '0'
jb error_delect
cmp al , '9'
jbe right
cmp al , 'A'
jb error_delect
cmp al , 'F'
jbe right
cmp al , 'a'
jb error_delect
cmp al , 'f'
ja error_delect

right:
ret

error_delect:
mov dx , offset error_msg
mov ah , 9h
int 21h
jmp exit

exit:
mov ax , 4c00h
int 21h
main endp
;-------------------------------------------------------------------
code ends
;*******************************************************************
end start
...全文
87 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gsy999 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ww884203 的回复:]
果然可以了,多谢楼上的大神。原来还是call的指令我不会用。。。看来是call的非要是proc,我以为和jmp差不多用就是多了一个IP压入栈呢,多谢了啊!
[/Quote]
不一定非要proc,但构造要对
ww884203 2011-11-08
  • 打赏
  • 举报
回复
果然可以了,多谢楼上的大神。原来还是call的指令我不会用。。。看来是call的非要是proc,我以为和jmp差不多用就是多了一个IP压入栈呢,多谢了啊!
gsy999 2011-11-08
  • 打赏
  • 举报
回复

;*******************************************************************
data segment
error_msg db 'Your input is not correct!','$'
input_first db 'Input the first digit :',13,10,'$'

data ends
;-------------------------------------------------------------------
stack segment para stack 'stack'
db 128 dup(?)
stack ends

;*******************************************************************
code segment
;-------------------------------------------------------------------
main proc far
assume cs:code , ds:data , ss:stack
mov ax , data
mov ds , ax
;原文的栈设置不需要,因为系统会自动设置
;mov ax , stack
;mov ss , ax
;mov sp , 20

;输出串
mov dx , offset input_first
mov ah , 9h
int 21h
;从键盘接收字符并回显
mov ah , 01h
int 21h

;调用子程序检查输出字符
call check_if_right

;jmp exit
exit:
mov ax , 4c00h
int 21h
main endp
;---------------------------------------------------------------------
;子程序 check_if_right
;检查al中是不是一个16进制ASCII数字
;---------------------------------------------------------------------
check_if_right PROC near
cmp al , '0'
jb error_delect
cmp al , '9'
jbe right
cmp al , 'A'
jb error_delect
cmp al , 'F'
jbe right
cmp al , 'a'
jb error_delect
cmp al , 'f'
jna right ;error_delect

error_delect:
mov dx , offset error_msg
mov ah , 9h
int 21h
jmp right ;exit
right:
ret
check_if_right endp
;-------------------------------------------------------------------
code ends
;*******************************************************************
end main
gsy999 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 ww884203 的回复:]
我想实现检查输入的字符是不是16进制数(也就是0-9a-zA-Z)
可是每次一输入就弹出ntvdm cpu 之类的东西,但是如果我在输入后面增加一个输出的话就不会遇到这样的情况,我是初学者不知道问题出在哪里,请大家帮忙指出错误在哪里,谢谢!

Assembly code


;*******************************************************……
[/Quote]
error_delect:
mov dx , offset error_msg
mov ah , 9h
int 21h
jmp exit

上面的jmp exit 有毛病的,因为这一小段是check_if_right的一部分,而check_if_right又是一个子程序,因此,不应当jmp exit,如果强行这样,就坏破了栈平衡(call 时,IP会压在栈上,ret时恢复之)
ww884203 2011-11-08
  • 打赏
  • 举报
回复
补充一下,在data里面还有一句是
input_first "Input the first digit $"
因为里面先定义了几个字符串,有的还没输出就删除了才发上来,不小心多删了一句。总之不是由于input_first确实的问题。
多谢大家指教,谢谢!我刚看汇编才半天,代码也是根据例子东拼西凑的,可能很不规范或者犯了什么基本错误,大家不要见笑,谢谢!

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧