我必须在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
答案 0 :(得分:2)
你已经完成了一半。
"如果我必须阅读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' 0并打印ascii值,你必须将其编码为ascii字符串,并显示整个字符串(就像你已经使用INT 21H / 09H一样)
也帮自己一个忙,并将这些问题分开。写一个" decode_bin"和" encode_bin"子函数,并用调用此函数替换循环中的INT,否则在2周左右之后你将无法读取它: - )