懂汇编语言的看一下,为什么用JNZ跳不出循环
发布网友
发布时间:2022-05-16 19:24
我来回答
共4个回答
热心网友
时间:2024-02-29 19:11
;实现两位的十六进制数用ASCII码显示
D SEGMENT
ASCII DB '0123456789ABCDEF'
HEX DB 3BH, 0FH, 04H ;16进制数
D ENDS
C SEGMENT
ASSUME CS:C, DS:D
START:
MOV AX, D
MOV DS, AX
MOV BX, OFFSET ASCII
LEA SI, HEX
MOV CX, 0304H
LI: MOV AL, [SI]
ROR AL, CL
AND AL, 0FH
XLAT ;换码:AL←DS:[BX+AL]
MOV DL, AL
MOV AH, 2
INT 21H
MOV AL,[SI]
AND AL, 0FH
XLAT
MOV DL, AL
INT 21H
MOV DL, 'H'
INT 21H
MOV DL, ' '
INT 21H
INC SI
DEC CH
JNZ LI
MOV AH, 4CH
INT 21H
C ENDS
END START
热心网友
时间:2024-02-29 19:11
jnz是zf=0时转移,和cx没有关系,可以直接用loop
热心网友
时间:2024-02-29 19:12
mov cl,4
ROR al,cl
你把CX的值改了,用PUSH CX POP CX保存一下吧。
热心网友
时间:2024-02-29 19:12
关键是在中间你改变了 cx !
-----------------------
DATAS SEGMENT
ASCII DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H ;对应A ~ F的ASCII码
HEX DB 3BH,0FH,04H ;假设两个16进制数
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,OFFSET ASCII ;BX指向ASCII码表
MOV SI,0
LEA SI,HEX
MOV CX,3
LI: MOV AL, [SI] ;AL取得一位16进制数
AND AL, 0F0H
PUSH CX ;;;;;;;;;;;;;
MOV CL,4
ROR AL,CL
POP CX ;;;;;;;;;;;;;
XLAT ;换码:AL←DS:[BX+AL]
MOV DL,AL ;欲显示的ASCII码送DL
MOV AH,2 ;2号DOS功能调用
INT 21H
MOV AL,[SI]
AND AL, 0FH ;只有低4位是有效的,高4位清0
XLAT ;换码:AL←DS:[BX+AL]
MOV DL,AL ;欲显示的ASCII码送DL
MOV AH,2 ;2号DOS功能调用
INT 21H
INC SI
DEC CX
JNZ LI ;显示一个ASCII码字符
MOV AH,4CH
INT 21H
CODES ENDS
END START