在8086组件中打印奇数从1到100

时间:2018-02-25 13:45:16

标签: assembly x86-16

语言:英特尔组装 目标处理器: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或更高的数字。有帮助吗?我也附加了输出,以便可视化我得到的东西。

enter image description here

工作版

由于错误的逻辑和实现,我没有得到所需的输出......现在我从接受的答案中得到了线索,现在我有了完整的代码。

{{1}}

1 个答案:

答案 0 :(得分:3)

    MOV AX, BX
    ADD AX, 0H
    AAA

此处bx为0..99值,然后为其添加零,AAA将保持值0..9不变,对于值10..99,它将设置为{{ 1}}到ah1到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逻辑简单的代码。)

编辑:和往常一样,如果您不理解为什么代码会做任何事情,请使用调试器来查看自己,发生了什么(+使用指令参考指南进行交叉检查)。实际上使用它即使你认为代码正在做正确的事情,因为有你不想要的东西的可能性仍然是巨大的,没有调试你的汇编代码,你几乎无法判断它是否是远程正确的(只是运行它并且接收正确的输出不计算,这甚至不值得运行时间。)