本帖最后由 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
|