装配中的加法和乘法

时间:2013-02-05 03:20:28

标签: assembly x86 nasm

我试图解决程序集中的问题而且我设法编写代码但是在显示结果时我得到了一个奇怪的输出。我想要添加3个数字的方块,其中一个是负数。这是我的代码,这是我用来组装,链接和运行的代码。谢谢!

编译和执行步骤:

nasm -g -f elf lab1.asm
gcc -o lab1 lab1.o
./lab

SECTION .data
message:    db  "Hello, this is Iva.", 0AH
anothermsg  db  "The sum of the numbers %d, %d and %d is %d", 0AH
len:        equ $-message
variable1:  dw  7
variable2:  dw  -11
variable3:  dw  19
SECTION .text
    extern printf
    global main
main:   

mov eax, dword [variable1]
movzx ebx, al
mov eax, ebx

imul eax
push eax



mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx

imul eax
push eax

mov eax, dword [variable3]
movzx ebx,al
mov eax,ebx

imul eax
pop ebx
add eax,ebx
pop ebx
add eax,ebx

push eax

push dword [variable3]
push dword [variable2]
push dword [variable1]
push anothermsg


call printf

mov eax,1
mov ebx,0
int 80h

1 个答案:

答案 0 :(得分:0)

我看到了几个错误。

首先,printf()接受ASCIIZ格式字符串(所有C字符串都是ASCIIZ,IOW,NUL终止)。但是,anothermsg并不以零字节结束。你必须明确附加一个。

其次,将整数变量声明为16位(dw = 16位),但是将它们从内存中取出为32位(例如mov eax, dword [variable1]dword = 32位)。这可能有用,但没有多大意义。只需将整数变量声明为32位(dd = 32位)。

第三,由于我不知道的原因(可能是因为前一个问题),你使用movzx将32位(或16位,取决于解释它的方式)值截断为8位,这使得-11的平方的计算错误。

请参阅,您将_11存储在variable2中:

1111111111110101 (binary)

在这2条指令之后:

mov eax, dword [variable2]
movzx ebx,al

你得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 00000000000000000000000011110101 (245 decimal)

然后在这两条指令之后:

mov eax,ebx
imul eax

你得到:

eax = 00000000000000001110101001111001 (60025 decimal)

如果你做movsx ebx,al而不是movzx ebx,al,那么你会得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 11111111111111111111111111110101 (-11 decimal)

然后在这两条指令之后:

mov eax,ebx
imul eax

最后:

eax = 00000000000000000000000001111001 (121 decimal)