[英]Print triangle of numbers in assembly x86
我必须在 tasm 中做一个程序,它必须在这样的数字上打印一个三角形:
input: n. Ex: n=4
output:
1
1 2
1 2 3
1 2 3 4
我设法让我的程序打印了这个东西,但我还必须让它处理 0 到 255 之间的数字,而不仅仅是数字。
我知道我必须逐位读取一个数字并创建这样的总和:
如果我必须读82,我先读8,把它放在一个寄存器中,然后,当我读2时,它必须加到8*10。
你能帮我在我的程序中实现这个吗?
.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 ;citire prima cifra din numar
int 21h
mov ah, 02h
mov dl, al
int 21h
sub al,30h
mov ah,10
mul ah
mov [nr],al ;mutam prima cifra inmultita cu 10 in nr
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
mov ah, 2
mov dx, bx
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
final:
mov AH,4Ch ; Function to exit
mov AL,00 ; Return 00
int 21h
end
你已经完成了一半。
“如果我必须读82,我先读8,把它放在一个寄存器中,然后,当我读2时,它必须加到8*10”
对于您读入的每个数字,您必须将前一个值乘以 10。不仅对于第二个,对于第三个也是如此(并且您可以对第一个执行此操作,因为读取的值为 0)
剩下的是:
result = 0
while (more digits to come)
result *= 10;
result += value of current digit
这样做,
82 将是 ((0*10 + 8) + 2) = 82
251 将是 (((0*10 + 2) *10 + 5) *10 +1 = 251
与在循环中输出数字相同,对于大于 9 的值,您不能简单地添加“0”并打印 ascii 值,您必须将其编码为 ascii 字符串,并显示整个字符串(就像您已经使用 INT 21H 所做的那样/09H )
也帮自己一个忙,把这些问题分开。 编写一个“decode_bin”和一个“encode_bin”子函数,并用对这个函数的调用替换循环中的 INT,否则你将在 2 周左右后无法读取它:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.