assembly 为什么在将数据从寄存器移动到内存时需要使用[ ](方括号),而在相反的情况下则不需要?

ulmd4ohb  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(126)

这是我的代码,它的工作正常:

section .bss
    bufflen equ 1024
    buff: resb bufflen

    whatread: resb 4

section .data

section .text

global main

main:
    nop
    read:
        mov eax,3           ; Specify sys_read
        mov ebx,0           ; Specify standard input
        mov ecx,buff        ; Where to read to...
        mov edx,bufflen     ; How long to read
        int 80h             ; Tell linux to do its magic

                            ; Eax currently has the return value from linux system call..
        add eax, 30h        ; Convert number to ASCII digit
        mov [whatread],eax  ; Store how many bytes has been read to memory at loc **whatread**

        mov eax,4           ; Specify sys_write
        mov ebx,1           ; Specify standart output
        mov ecx,whatread    ; Get the address of whatread to ecx
        mov edx,4           ; number of bytes to be written
        int 80h             ; Tell linux to do its work

        mov eax, 1; 
        mov ebx, 0; 
        int 80h

下面是一个简单的运行和输出:

koray@koray-VirtualBox:~/asm/buffasm$ nasm -f elf -g -F dwarf buff.asm
koray@koray-VirtualBox:~/asm/buffasm$ gcc -o buff buff.o
koray@koray-VirtualBox:~/asm/buffasm$ ./buff
p
2koray@koray-VirtualBox:~/asm/buffasm$ ./buff
ppp
4koray@koray-VirtualBox:~/asm/buffasm$

我的问题是:这两个说明的作用是什么:

mov [whatread],eax  ; Store how many byte reads info to memory at loc whatread
        mov ecx,whatread    ; Get the address of whatread in ecx

为什么第一个可以使用[],而另一个不可以?
当我尝试将上面的第二行替换为:

mov ecx,[whatread]  ; Get the address of whatread in ecx

该可执行文件将无法正常运行,它将不会在控制台中显示任何内容。

vuv7lop3

vuv7lop31#

使用括号和不使用括号基本上是两件不同的事情:
括号表示内存中给定地址的值。
没有括号的表达式表示地址(或值)本身。
示例:

mov ecx, 1234

方法:将值1234写入寄存器ecx

mov ecx, [1234]

方法:将存储在存储器地址1234处的值写入寄存器ecx

mov [1234], ecx

方法:将存储在ecx中的值写入存储器的地址1234

mov 1234, ecx

...没有意义(在此语法中),因为1234是一个不能更改的常数。
Linux“write”系统调用(INT 80 h,EAX=4)需要写入值的地址,而不是值本身!
这就是为什么在此位置不使用括号的原因!

相关问题