assembly x86汇编语言中的内存寻址

lymgl2op  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(148)

我有下面的代码,将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的值。

yzxexxkh

yzxexxkh1#

  • 我想知道为什么我需要先创建一个未初始化的变量(result)*

它不一定是uninitialized,但每当你想用SYS_WRITE显示一些东西时,就需要在内存中(而不是寄存器中),正如Margaret评论的那样。
您错误地将内存变量num1, num2, result定义为dbresb,它们只保留1个字节(8位),而不是指令

mov ecx, [num1]
mov eax, [num2]
mul ecx

都以4字节(32位)工作。
section .data中的内存包含类似02 1C 00 00 00 00...的内容(十六进制表示法)。

mov ecx, [num1] ; load 0x00001C02 to ECX.
mov eax, [num2] ; load 0x0000001C to EAX.
mul ecx         ; compute 0x00031038 to EAX and 0 to EDX.

您应该使用以下命令将数字声明为32位

num1   DD  2
num2   DD 28
result DD  0

或仅加载/存储寄存器的最低八位:

movzx ecx,[num1] ; load 0x00000002 to ECX.
movzx eax,[num2] ; load 0x0000001C to EAX.
mul ecx          ; compute 0x00000038 to EAX and 0 to EDX.
mov [result],AL  ; result will be 0x38 = 56 = '8'.

相关问题