在 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 它将设置ah
到 1
和 al
到 0..15.
这没有任何意义(值 0..99 不是 "BCD unpacked" 类型的值),我也无法从评论中找出您要实现的算法。您的代码也没有任何效率。
为什么不从字符串"01"
开始,打印50次,每次在第二个字母后面加上2
,结束时'9'
,再调整它由 -10
并在第一个字母后添加 +1
。
除非你想练习算术,否则只有两件事:
1) 要测试值是否为奇数,请使用 test some_register,1
位测试,每个奇数整数值都必须设置最低有效位,因为这就是您获得 20[=42= 的方式] 值添加到整数。
2) 通过一些不同的算法将多位数值转换为字符串,不确定你是从哪里学到的 AAA
,这在初学者代码(或任何其他 BCD 相关指令,尽管 AAM
和 AAD
有时会被欺骗成有趣的效果,当编码大小时,但这不是初学者应该担心的事情,用户宁愿 div by 10
逻辑简单的代码)。
编辑:和往常一样,如果您不明白为什么您的代码会执行任何操作,请使用调试器自己查看发生了什么(+ cross-check 以及说明参考指南)。即使您认为代码在做正确的事情,也要实际使用它,因为存在您并不真正想要的东西的可能性仍然很大,如果不调试您的汇编代码,您几乎无法判断它是否正确(只是 运行使用它并接收正确的输出不算数,这甚至不值得运行)。
语言:英特尔汇编 目标处理器: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 它将设置ah
到 1
和 al
到 0..15.
这没有任何意义(值 0..99 不是 "BCD unpacked" 类型的值),我也无法从评论中找出您要实现的算法。您的代码也没有任何效率。
为什么不从字符串"01"
开始,打印50次,每次在第二个字母后面加上2
,结束时'9'
,再调整它由 -10
并在第一个字母后添加 +1
。
除非你想练习算术,否则只有两件事:
1) 要测试值是否为奇数,请使用 test some_register,1
位测试,每个奇数整数值都必须设置最低有效位,因为这就是您获得 20[=42= 的方式] 值添加到整数。
2) 通过一些不同的算法将多位数值转换为字符串,不确定你是从哪里学到的 AAA
,这在初学者代码(或任何其他 BCD 相关指令,尽管 AAM
和 AAD
有时会被欺骗成有趣的效果,当编码大小时,但这不是初学者应该担心的事情,用户宁愿 div by 10
逻辑简单的代码)。
编辑:和往常一样,如果您不明白为什么您的代码会执行任何操作,请使用调试器自己查看发生了什么(+ cross-check 以及说明参考指南)。即使您认为代码在做正确的事情,也要实际使用它,因为存在您并不真正想要的东西的可能性仍然很大,如果不调试您的汇编代码,您几乎无法判断它是否正确(只是 运行使用它并接收正确的输出不算数,这甚至不值得运行)。