问题
I must do a program in tasm which have to print a triangle on numbers like this:
input: n. Ex: n=4
output:
1
1 2
1 2 3
1 2 3 4
I've managed to make my program print this thing, but i also have to make it work with numbers between 0 and 255, not only for digits.
I know that i have to read a number digit by digit and create a sum like this:
if i have to read 82, i read firstly 8, put it in a register, and then, when i read 2, it must be added to 8*10.
Can you help me to implement this in my program?
.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
回答1:
you're half way done.
"if i have to read 82, i read firstly 8, put it in a register, and then, when i read 2, it must be added to 8*10"
For EACH digit you read in, you have to multiply the previous value by 10. not only for the 2nd, also for the 3rd (and you can do this for the first, since the value read there was 0)
what remains is:
result = 0
while (more digits to come)
result *= 10;
result += value of current digit
doing this,
82 will be ((0*10 + 8) + 2) = 82
251 will be (((0*10 + 2) *10 + 5) *10 +1 = 251
same with outputting your numbers in the loop, for values > 9, you cannot simply add '0' and print the ascii value, you have to encode it as an ascii string, and display the whole string ( like you already did with INT 21H/09H )
Also do yourself a favour, and divide these problems. Write a "decode_bin" and a "encode_bin" sub-functions, and replace the INTs in your loop with calls to this functions, otherwise you'll not ba able to read it, after 2 weeks or so :-)
来源:https://stackoverflow.com/questions/41743509/print-triangle-of-numbers-in-assembly-x86