【发布时间】:2012-09-14 05:41:12
【问题描述】:
我试图简单地按顺序打印数字,即
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
使用循环, 首先,我将每个数字转换为 Hexa 打印,将其重置为十进制增量 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
为什么会这样???
这是我的代码,
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
P.S:我从这张图表中得到了帮助来理解这些数字。
【问题讨论】:
-
你应该压缩你的代码,例如。 G。使用一次
ror ax,4而不是四次ror ax,1。此外,不是每个人都知道中断调用的作用(我从未在 DOS 下进行过汇编),如果您在这样的行中编写简短的 cmets,则更容易知道代码的作用。 -- 并且请尽可能多地删除空行。空行非常适合可读性,可以分隔代码的逻辑块,但是多个后续的空行只会过多地拉伸列表。 -
我在 x64 中使用 DosBox,我认为这就是为什么我不能直接使用 ROR,4 或 SHR,4 ,我必须单独使用它们。并添加了评论
-
IIRC,您使用的是 TASM,对吗?可能是那个汇编程序的一个缺陷,因为我的英特尔手册说,立即旋转/移位也可以在 16 位模式下工作。不管怎样,
mov word ptr [BX+2],AX怎么样——这行得通吗? ;-)