繁体   English   中英

我正在Linux上学习汇编语言,[]符号使我感到困惑。 (NASM)

[英]I'm learning assembly on linux, and [] notation is confusing me. (NASM)

我正在使用以下代码:

section .text
    global _start
_start:
    mov ebx, testing
    mov [ebx], byte 0x4A
    add ebx, byte 1
    mov [ebx], byte 0x4B
    add ebx, byte 1
    mov [ebx], byte 0x4C

    ;sets var1 as '*'
    mov eax, 0x2A
    mov [var1], eax

    ;sets var2 as 'N'
    mov eax, 0x4E
    mov [var2], eax

    ;sets var3 = var2
    mov eax, [var2]
    mov [var3], eax

    ;Prints var1
    mov eax, 4
    mov ebx, 1
    mov ecx, var1
    mov edx, 1
    int 0x80

    ;Jumps a line
    mov eax, 4
    mov ebx, 1
    mov ecx, line_break
    mov edx, 2
    int 0x80

    ;Prints var2
    mov eax, 4
    mov ebx, 1
    mov ecx, var2
    mov edx, 1
    int 0x80

    ;Jumps a line
    mov eax, 4
    mov ebx, 1
    mov ecx, line_break
    mov edx, 2
    int 0x80

    ;Prints var3
    mov eax, 4
    mov ebx, 1
    mov ecx, var3
    mov edx, 1
    int 0x80

    ;Jumps a line
    mov eax, 4
    mov ebx, 1
    mov ecx, line_break
    mov edx, 2
    int 0x80

    ;Prints variable
    mov eax, 4
    mov ebx, 1
    mov ecx, variable
    mov edx, 3
    int 0x80

    ;Jumps a line
    mov eax, 4
    mov ebx, 1
    mov ecx, line_break
    mov edx, 2
    int 0x80

    ;Prints testing
    mov eax, 4
    mov ebx, 1
    mov ecx, testing
    mov edx, 3
    int 0x80

    ;Jumps a line
    mov eax, 4
    mov ebx, 1
    mov ecx, line_break
    mov edx, 2
    int 0x80


    ;Finishes program
    mov eax, 1
    mov ebx, 1
    int 0x80

section .data
    variable times 3 db 0x2A
    line_break dw 0x0D0A

section .bss
    testing resb 3
    var1 resb 1
    var2 resb 1
    var3 resb 1

它输出:

*
N
N
***
JKL

我不明白的是:为什么在第一行“ mov ebx,testing”中没有括号“ testing”,以及为什么这些括号出现在“ mov eax,[var2]”行的[var2]中。 这种表示法是如何工作的? [var2]不应该是var2的有效地址吗?

标识符周围的方括号表示该值应用作指针。 因此,没有括号:

mov ebx, testing

testing 地址移到eax寄存器中

mov eax, [var2]

将var2指向的移动到eax

为什么在第一行“ mov ebx,测试”中没有方括号“测试”

您问题中的代码是用NASM语法编写的。 还有其他x86汇编器使用略有不同的语法(例如MASM和TASM)。

无论如何, mov ebx, testing意味着“将testing地址放置在寄存器ebx 然后在下一行使用该地址,指令mov [ebx], byte 0x4A将值0x4A写入ebx指向的第一个字节(即, testing的第一个字节)。

在MASM / TASM语法中,您应该将其编写为mov ebx, OFFSET testing

为什么这些括号出现在“ mov eax,[var2]”行的[var2]中

因为在这里您要获取var2的值,而不是var2的地址。 在NASM语法中,您可以使用方括号来完成此操作,例如mov eax,[var2] 在MASM / TASM语法中, mov eax,[var2]mov eax,var2都将读取var2处的值。

注意var1var2var3均为一个字节。 因此,尝试从这些变量读取32位寄存器或向这些变量写入32位寄存器看起来像是一个可疑的bug。 您可能需要将声明从resb 1更改为resd 1 ,或仅从它们读取/ resd 1写入8位寄存器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM