我想用汇编语言做一些简单的事 另外两个数字,并在屏幕上打印结果。
我做了那段代码:
.Model SMALL
.Stack 100h
.Code
start:
MOV ax, 10
ADD ax, 5
MOV ah, 02h
INT 21h
MOV ah, 01h
INT 21h
MOV ah, 4ch
INT 21h
end start
编译代码后没有任何错误,告诉我一个奇怪的角色。
修改:
MOV dl, 10
ADD al,5
MOV dl, al
MOV ah,02h
INT 21h
但仍打印一个奇怪的角色 我不知道如何在屏幕上打印数字
答案 0 :(得分:2)
是的,你 很可能会得到一个奇怪的字符因为int 21 / ah = 02要求打印的字符在dl
寄存器中,而你没有填充{ {1}}任何事情。
您可能希望使用以下内容传输值:
dl
但是,请注意,即使您执行将值从mov ax, 10
add ax, 5
push ax ; these are the two new lines.
pop dx
mov ah, 02h
转移到al
,字符编号15也可能不是您所期望的。 15是ASCII控制字符之一,我不确定DOS中断将为它们输出什么。
如果您要打印数字dl
,则需要两个调用,一个使用15
,第二个调用dl = 31h
(两个ASCII) dl = 35h
和1
个字符的代码。
如果您想知道如何在寄存器中取一个数字并以可读的形式输出该数字的数字,an earlier answer of mine中就会出现一些伪代码。
从那个答案来看,你有伪代码:
5
现在您需要将其转换为x86程序集。让我们从 val = 247
units = val
tens = 0
hundreds = 0
loop1:
if units < 100 goto loop2
units = units - 100
hundreds = hundreds + 1
goto loop1
loop2:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop2
done:
if hundreds > 0: # Don't print leading zeroes.
output hundreds
if hundreds > 0 or tens > 0:
output tens
output units
;; hundreds = 2, tens = 4, units = 7.
:
ax
现在代码段(尽管由于我自装配以来已经有一段时间没有出现任何错误)应打印出数百位数字,并且只留下数十位和单位数字。
复制功能两次以获得十位和单位位置应该是一件简单的事情。