NASM Hello World Segmentation Fault

时间:2013-07-25 00:52:48

标签: assembly 64-bit nasm

所以是的,我正在修改汇编级编程......

这是我到目前为止所拥有的。

global _start

section .text
_start:

    mov eax, 4      ; write
    mov ebx, 1      ; stdout
    mov ecx, msg
    mov edx, msg.len
    int 0x80        ; system call


    mov eax, 1      ; exit
    mov ebx, 0      ; exit code
    int 0x80        ; system call

section .data

    msg: db "Hello world!", 10  ; Defines the string "Hello world!\n"
    .len equ $-msg

声明.len equ $-msg如何运作?我明白这是字符串的长度。我也知道equ在C中就像#define。所以这个变量在内存中不存在,它由汇编器放置。 (NASM)

$符号做什么,后来发生了减法?

我的输出会导致段错误,我希望在理解.len equ $-msg语法后我能够自行解决这个问题。 我已经解决了这个问题,但仍然不理解$ notion。

编辑 由于这是一个格式错误的程序导致的Segfault。 已修复

1 个答案:

答案 0 :(得分:2)

$表示当前行的地址。以下是:

.len  equ  $-msg

表示当前地址减去msg的地址。这给出了msg.len之间存储的数据的长度(因为.len的地址由$表示)。因此,符号.len表示(等于)该长度值。