语言:英特尔组装 目标处理器:8086
我想完成这个主题并使用以下代码来实现:
.MODEL SMALL
.STACK 100H
.DATA
LF EQU '0DH'
.CODE
MAIN PROC
MOV CX,0001H
MOV DX,0
BACK: MOV DL, CH
OR DL, 30H
MOV AH, 2
INT 21H
MOV DL, CL
OR DL, 30H
MOV AH, 2
INT 21H
CMP CL, 9
MOV DL, 20H
MOV AH, 2
INT 21H
JGE UNITSREACHED
ADD CL, 2
JMP UNITSUNREACHED
UNITSREACHED:
ADD CH, 1
MOV CL, 1
CMP CH , 9
JG EXIT
UNITSUNREACHED: JMP BACK
EXIT:
END MAIN
MAIN ENDP
但是当我运行代码时,1,3,5 .... 15正常,然后从1开始......它从不打印17或更高的数字。有帮助吗?我也附加了输出,以便可视化我得到的东西。
工作版
由于错误的逻辑和实现,我没有得到所需的输出......现在我从接受的答案中得到了线索,现在我有了完整的代码。
{{1}}
答案 0 :(得分:3)
MOV AX, BX
ADD AX, 0H
AAA
此处bx
为0..99值,然后为其添加零,AAA
将保持值0..9不变,对于值10..99,它将设置为{{ 1}}到ah
和1
到0..15。
它没有任何意义(值0..99不是“BCD解包”类型的值),也不能从评论中找出你试图实现的算法。你的代码也没有任何效率。
为什么不首先使用字符串al
并将其打印50次,每次都将"01"
添加到第二个字母,当它超过2
时,再将其调整为'9'
并将-10
添加到第一个字母。
除非你想练习算术,否则只需要做两件事:
1)测试值是否为奇数,使用+1
位测试,每个奇数位值必须设置最低有效位,因为这就是你如何将2 0 值添加到整数。
2)通过一些不同的算法将multidigit值转换为字符串,不确定你在哪里选择test some_register,1
,这在初学者代码(或任何其他BCD相关指令,尽管{{1}在编写大小时,有时可以将AAA
变成有趣的效果,但这不是初学者应该担心的问题,而是用户而不是AAM
逻辑简单的代码。)
编辑:和往常一样,如果您不理解为什么代码会做任何事情,请使用调试器来查看自己,发生了什么(+使用指令参考指南进行交叉检查)。实际上使用它即使你认为代码正在做正确的事情,因为有你不想要的东西的可能性仍然是巨大的,没有调试你的汇编代码,你几乎无法判断它是否是远程正确的(只是运行它并且接收正确的输出不计算,这甚至不值得运行时间。)