在 8086 汇编中打印从 1 到 100 的奇数 no.s

Printing odd no.s from 1 to 100 in 8086 assembly

语言:英特尔汇编 目标处理器:8086

我想完成这个主题并使用以下代码来实现:

.MODEL SMALL
.STACK 1000H
.CODE
MAIN PROC
MOV DX, 0002H
MOV CX, 0064H
BODY:
MOV DX, 0002H
MOV BX, 0064H
SUB BX, CX
MOV AX, BX
DIV DL
CMP AH, 1H
JNE GO
PRINT:
MOV AX, BX
ADD AX, 0H
AAA
OR AX, 3030H
ROL AX, 1
ROL AX, 1
ROL AX, 1
ROL AX, 1
ROL AX, 1
ROL AX, 1
ROL AX, 1
ROL AX, 1
MOV DL, AL
MOV AH, 2H
INT 21H
MOV AX, BX
ADD AX, 0H
AAA
OR AX, 3030H
MOV DL, AL
MOV AH, 2H
INT 21H
GO: LOOP BODY
MAIN ENDP 
END

但是当我 运行 编码时,它在 1,3,5....15 时正常,然后它再次从 1 开始...它从不打印 17 或更高的数字。有什么帮助吗?我也附加了输出以可视化我得到的结果。


工作版本

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

.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
    MOV AX, BX
    ADD AX, 0H
    AAA

这里 bx 是 0..99 值,然后将零添加到它并且 AAA 将保持值 0..9 不变,对于值 10..99 它将设置ah1al 到 0..15.

这没有任何意义(值 0..99 不是 "BCD unpacked" 类型的值),我也无法从评论中找出您要实现的算法。您的代码也没有任何效率。

为什么不从字符串"01"开始,打印50次,每次在第二个字母后面加上2,结束时'9',再调整它由 -10 并在第一个字母后添加 +1

除非你想练习算术,否则只有两件事:

1) 要测试值是否为奇数,请使用 test some_register,1 位测试,每个奇数整数值都必须设置最低有效位,因为这就是您获得 20[=42= 的方式] 值添加到整数。

2) 通过一些不同的算法将多位数值转换为字符串,不确定你是从哪里学到的 AAA,这在初学者代码(或任何其他 BCD 相关指令,尽管 AAMAAD 有时会被欺骗成有趣的效果,当编码大小时,但这不是初学者应该担心的事情,用户宁愿 div by 10 逻辑简单的代码)。


编辑:和往常一样,如果您不明白为什么您的代码会执行任何操作,请使用调试器自己查看发生了什么(+ cross-check 以及说明参考指南)。即使您认为代码在做正确的事情,也要实际使用它,因为存在您并不真正想要的东西的可能性仍然很大,如果不调试您的汇编代码,您几乎无法判断它是否正确(只是 运行使用它并接收正确的输出不算数,这甚至不值得运行)。