我有下面的代码,将num1和num2相乘,然后打印结果(想法是打印数字8,在ascii中是56),我想问的2个问题在代码中标记为注解。
section .text
global _start
_start:
mov ecx, [num1]
mov eax, [num2]
mul ecx
mov [result], eax
mov edx, 1
mov ecx, result ; 1. why it doesn't work if I replace the word result with eax.
; 2. why it has to be "result" instead of "[result]" as with the previous
lines?
mov ebx, 1
mov eax, 4
int 0x80
mov eax, 1
int 0x80
section .data
num1 db 2
num2 db 28
section .bss
result resb 1
对于第一个问题,我想知道为什么我需要先创建一个未初始化的变量(result)来存储我想传递给ecx的值。
1条答案
按热度按时间yzxexxkh1#
它不一定是uninitialized,但每当你想用
SYS_WRITE
显示一些东西时,就需要在内存中(而不是寄存器中),正如Margaret评论的那样。您错误地将内存变量
num1, num2, result
定义为db
或resb
,它们只保留1个字节(8位),而不是指令都以4字节(32位)工作。
section .data
中的内存包含类似02 1C 00 00 00 00...
的内容(十六进制表示法)。您应该使用以下命令将数字声明为32位
或仅加载/存储寄存器的最低八位: