[英]Print triangle of multidigit number in assembly x86
我必须做 o 读取 0 到 255 之间的数字并打印半金字塔的程序,如下所示:
input: 4
output:
1
1 2
1 2 3
1 2 3 4
我已经设法为 0 到 9 之间的数字做到了,但我真的无法为两到三位数做到这一点。
看下面的代码
.model small
.stack 100h
.data
msg db "Enter the desired value: $", 10, 13
nr db ?
.code
mov AX, @data
mov DS, AX
mov dl, 10
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
mov DX, OFFSET msg
mov AH, 9
int 21h
xor ax, ax
mov ah, 08h
int 21h
mov ah, 02h
mov dl, al
int 21h
sub al,30h
mov ah,10
mul ah
mov [nr],al
mov ah, 08h
int 21h
mov ah, 02h
mov dl, al
int 21h
sub al, 30h
add [nr], al
sub nr,30h
mov dl, 10
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
mov cx,1
mov bx,31h
mov ah, 2
mov dx, bx
int 21h
loop1:
xor ax, ax
mov al, nr
cmp ax, cx
je final
mov dl, 10
mov ah, 02h
int 21h
mov dl, 13
mov ah, 02h
int 21h
mov bx, 0
loop2:
inc bx
add bx,30h
call function
int 21h
sub bx,30h
cmp bx, cx
jne loop2
inc bx
add bx,30h
mov ah, 2
mov dx, bx
int 21h
inc cx
jmp loop1
function:
MOV BX,10
ASC2:
mov dx,0 ; clear dx prior to dividing dx:ax by bx
DIV BX ;DIV AX/10
ADD DX,48 ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER
dec si ; store characters in reverse order
mov [si],dl
CMP AX,0
JZ EXTT ;IF AX=0, END OF THE PROCEDURE
JMP ASC2 ;ELSE REPEAT
EXTT:
mov ah,9 ; print string
mov dx,si
int 21h
final:
mov AH,4Ch ; Function to exit
mov AL,00 ; Return 00
int 21h
end
(下面的每一段都是一个错误/问题,需要解决......也许你应该从头开始并尝试写一些更优雅的东西,因为这有点“凌乱”)
什么是sub nr,30h
(在add [nr], al
)? 你能解释一下,它有什么作用吗? 试着想象一下, [nr]
中的值是什么以及该子函数对它有什么作用。 您必须决定,无论是使用数值还是 ASCII 字符,都不要盲目地将两者混合在一起。
将这些“新行”序列移动到单独的过程中,因此您可以call newline
而不是那 6 行,这样可以更轻松地阅读源代码,而且您可以使用push/pop
将它们包裹起来以保留寄存器值。
为什么ah=8, int 21h
input char,什么时候再输出呢? 然后您可以使用ah=1
"with echo" 输入。
add bx,30h
call function
^^ 再次,如果bx
是像15
这样的数值,则在转换为 ASCII 之前向其添加'0'
没有意义。 它将把15
变成63
,并显示"63"
(如果你的“ function
”是正确的——它不是)。
call function
后的int 21h
做什么?
function:
不会返回。
function:
就像参数在ax
,但是我猜主代码是用bx
调用它的……尽管如此, bx
内容将被破坏,而主代码不希望这样。
等等...等等...太多了。 删除它,然后重新开始。 停止向代码添加随机指令,首先确保您有高层次的概述和清晰的想法,您想用哪个值做什么以及为什么,然后只编写执行该操作的指令。 经常在调试器中验证 2-6 行新行是否符合您的预期(因为它们很可能不会)。 “只添加一堆指令并稍微修改它们,直到它起作用”方法可能适用于某种高级语言,但在汇编中只有 20 条指令长代码就有数百万种可能性,因此可能需要数年时间。 而是专注于了解您的期望,这样您就可以轻松地将调试器的状态与您的期望进行比较,并找出任何差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.