此代码是否正确(数字加号,然后打印结果)

时间:2012-04-02 11:49:01

标签: assembly x86 dos

我想用汇编语言做一些简单的事 另外两个数字,并在屏幕上打印结果。

我做了那段代码:

.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 

但仍打印一个奇怪的角色 我不知道如何在屏幕上打印数字

1 个答案:

答案 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 = 35h1个字符的代码。

如果您想知道如何在寄存器中取一个数字并以可读的形式输出该数字的数字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

现在代码段(尽管由于我自装配以来已经有一段时间没有出现任何错误)应打印出数百位数字,并且只留下数十位和单位数字。

复制功能两次以获得十位和单位位置应该是一件简单的事情。