我试图简单地按顺序打印数字,即 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,使用循环,首先我将每个数字转换为十六进制并打印,然后将其重置为十进制,递增 1,然后打印下一个数字,直到数字等于 9。当数字等于 9 时,我使用 DAA 简化数字,并在旋转和移位数字后最终将结果存储在字符串中。
输出在 16 之前都很好,但在 16 之后,序列会重复,
期望的输出是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
当前输出是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,11,12,13,14,15
为什么会这样呢?
以下是我的代码:
输出在 16 之前都很好,但在 16 之后,序列会重复,
期望的输出是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
当前输出是:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,11,12,13,14,15
为什么会这样呢?
以下是我的代码:
MOV CX,20 ;Number of Iterations
MOV DX,1
L1:
PUSH DX
ADD DX,30H
MOV AH,02H ;PRINT Content of DX
INT 21H
POP DX
ADD DX,1
CMP DX,09d ;If number is Greater than 9 jump to L2
JA L2
LOOP L1
L2:
PUSH DX
MOV AX,DX
DAA ;Convert to the Decimal
XOR AH,AH ;SET AH to 0000
ROR AX,1
ROR AX,1
ROR AX,1
ROR AX,1
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADC AX,3030h
MOV BX,OFFSET Result
MOV byte ptr[BX],5 ; Length of the String
MOV byte ptr[BX+4],'$' ;5th position of string , $=Terminator
MOV byte ptr[BX+3],AH ;2nd Number onto 4th position
MOV byte ptr[BX+2],AL ;3rd number onto 3rd Position
MOV DX,BX
ADD DX,02 ;1st 2 positions of String are type of string and
length respectively
MOV AH,09H ;to print the string
INT 21H
POP DX
ADD DX,1
LOOP L2
MOV AH,4CH ;Return control to the DOS
INT 21H
附注:我参考了这张图表来理解数字。
ror ax,4
一次而不是四次ror ax,1
。此外,并不是每个人都知道中断调用的作用(我从未在DOS下进行汇编),如果您在这些行中写入简短的注释,那么了解代码的功能将更容易。请尽可能删除多余的空行。空行对于可读性、分隔逻辑代码块非常有用,但是连续多个空行会使代码清单过长。 - IdiotFromOutOfNowheremov word ptr [BX + 2],AX
怎么样?;-) - IdiotFromOutOfNowhere