我必须做一个程序,它读取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
答案 0 :(得分:0)
(它下面的每个段落都有一个错误/问题,需要解决......也许你应该从头开始尝试写一些更优雅的东西,因为这有点"凌乱" )
什么是sub nr,30h
(add [nr], al
之后)?你能解释一下,它做了什么?试着想象一下,[nr]
中的值是什么,以及该子对它做了什么。你必须决定,无论你是使用数字值还是ASCII字符,都不要盲目地将两者混合在一起。
移动那些"新线"序列分成单独的过程,所以你可以call newline
而不是那6行,它将更容易阅读源,你可以用push/pop
包围它们来保存寄存器值。
为什么ah=8, int 21h
输入char,然后输出?你可以使用ah=1
" echo"输入然后。
add bx,30h
call function
再次 ^^,如果bx
是15
之类的数值,则在转换为ASCII之前向其添加'0'
并不合理。它会将15
转换为63
,并显示"63"
(如果您的" function
"是正确的 - 它不是)。
int 21h
做什么之后 call function
?
function:
将不会返回。
function:
就像参数一样在ax
中,但主要代码是用bx
调用它我猜...但是,bx
内容将被销毁,而主要代码并不期望这样。