2013-07-25 51 views
0

所以是的,我正在修補程序集編程...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語法時自己解決這個問題。我修復了這個錯誤,但仍然不理解$概念。

編輯 Segfault引起的這是一個畸形的程序。固定

+0

您可以添加您的修復程序的分段錯誤? – lurker

+0

@mbratch完成! (: – user3728501

回答

2

$表示當前行的地址。所以如下:

.len equ $-msg 

表示當前地址減去地址msg。這給出了存儲在msg.len之間的數據的長度(因爲.len的地址由$表示)。因此,符號.len表示(等於)該長度值。

+0

因此,在定義字符串之後,必須立即計算長度,在下一行? – user3728501

+0

正確。請注意,您的標記是64位,您得到的是32位代碼 –

+0

@EdwardBird是的,在asm中,事情是完全字面的,如果它們在不同的行上,並且中間有任何指令,那麼'$'將是一個不同的值(表示不同的內存地址),然後'$ -msg'不會是'msg'。 – lurker