懂汇编语言的看一下,为什么用JNZ跳不出循环

2025-05-21 23:00:15
推荐回答(4个)
回答1:

;实现两位的十六进制数用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

回答2:

jnz是zf=0时转移,和cx没有关系,可以直接用loop

回答3:

mov cl,4
ROR al,cl
你把CX的值改了,用PUSH CX POP CX保存一下吧。

回答4:

关键是在中间你改变了 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