|
发表于 2012-8-20 09:43:52
|
显示全部楼层
本帖最后由 lukelqz 于 2012-8-20 09:49 编辑
首先来分析一下,je指令
je功能: ZF=1,转至标号处执行
你的原意是cmp后,如果两者相等,跳出循环,显示月份。
but 问题就出在了,inc指令
inc这条指令执行结果会影响AF、OF、PF、SF、ZF标志位,但不影响CF标志位。
so你在cmp和je指令之间加上了inc后,就出问题了,本来cmp可以让zf标志位置1的,但是加上inc后,永远不能等于1了,程序死循环ing
帮你改后
- ;这是一个将输入数字’1-9,A-C‘翻译成月份的程序
- assume ds:data,cs:code
- data segment
- table db '123456789ABC'
- montab db 'JAN','FEB','MAR','APR','MAY','JUL'
- db 'JUN','AUG','SEP','OCT','NOV','DEC'
- biaot db 'month?'
- data ends
- code segment
- start:mov ax,data ;前期准备工作
- mov ds,ax
- mov ax,0b800h
- mov es,ax
- mov si,0
-
- mov cx,6 ;将'month?'显示在屏幕上
- mov bp,offset biaot
- pr:mov dl,ds:[bp]
- mov es:[si],dl
- inc bp
- add si,2
- loop pr
-
- mov ax,0 ;等待键盘输入
- int 16h
-
- mov bp,offset table ;反利用直接寻表法将ASCII码转化为数字
- mov cx,12
- ; mov di,0 ;利用di来存储转换后的数字(虽是多此一举可直接用bp)因为(bp)=(di)-1
- turn:cmp al,ds:[bp]
- ; inc di ;问题所在(如果没有这句程序运行正常,有这句程序会死,虽然是无用的)
- ; mov di,bp
- je cal
- inc bp
- loop turn
-
- jmp start
-
- cal:mov ax,bp
- mov cl,3
- mul cl
- mov bx,ax
-
- mov cx,3 ;利用(bx)=(bp)*3来寻找该输出的字符
- s:mov dl,montab[bx]
- mov es:[si],dl
- inc bx
- add si,2
- loop s
-
- mov ax,0 ;等待输出后退出
- int 16h
-
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
|
|