NASM划分和乘法

时间:2016-02-07 19:04:01

标签: assembly nasm division multiplication x86-16

我正在尝试使用程序集实现梯形区域的公式,但遇到了将“ax”寄存器传递给结果变量。我做错了哪里?请有人指点我。或者是计算问题?正如我在分裂后理解的那样,我可以传递给bl不同的值,当“ax”将保持“5”的结果然后我可以进行乘法并将ax传递给结果,这将是“15”

section .data
a : dw 3
b : dw 7
h : dw 3
n : dw 2
result: dw 0

section .text
global main

main:
mov ax,[a]
add ax,[b]
mov bl,[n]
div bl
mov bl,[h]
mul bl
mov result,ax
mov eax,1
mov ebx,0
int 80h

要编译并运行它我使用以下脚本:

nasm -f elf -l $1.lst $1.asm
gcc -m32 -o $1 $1.o

1 个答案:

答案 0 :(得分:3)

  

正如我在分裂后理解的那样,我可以传递给不同的值,当" ax"将留下" 5"

的结果

这不完全正确!在您的示例中,AX等于5,因为前一个除法导致余数为零。所以你可以说:" al" 将留下" 5" 的结果。

a : dw 3
b : dw 7
h : dw 3
n : dw 2

请将冒号附加到标签名称。或者根本不要写它们(数据定义不需要它们)。

mov bl,[n]
div bl
mov bl,[h]

由于NASM并不太关心尺寸,因此您可以将这些大小的变量分配给字节大小的寄存器。有时候这很有用,但你需要注意它!

mov result,ax

这当然是真正的问题。要让NASM在结果变量中写AX,您必须使用括号 []

mov [result], ax
相关问题