2012-10-05 61 views
2

在Linux程序集中嘗試我的手,我遇到了以下問題。我剛剛開始,所以我的程序是一個相對簡單的程序,它源於我在linuxassembly上找到的一些示例。它將第一個參數傳遞給命令行並將其打印出來。以下是我迄今爲止...使用linux程序集將命令行打印變量

section .bss 
    test_string: resb 3 

section .text 
    global _start 

_start: 
    pop ebx  ;argument number 
    pop ebx  ;program name 
    pop ebx  ;first argument 
    mov [test_string],ebx 

    mov eax,4 
    mov ebx,1 
    mov ecx,test_string 
    mov edx,3 
    int 80h 

    mov eax,1 
    mov ebx,0 
    int 80h 

我知道,這是寫得不好,但因爲我是新來這個,我只是希望更好地瞭解前我謹彙編指令/變量工作上。我組裝和使用鏈接...

nasm -f elf first.asm 
ld -m elf_i386 -s -o first first.o 

然後我跑使用..

./first one two 

我以爲這樣就可以打印出「一」,但它打印出gibbrish像「Y * &」 。我究竟做錯了什麼?我的test_string是錯誤的類型嗎?

回答

2

您試圖打印出指向字符串的指針的值而不是打印字符串。你想這樣做。

pop ebx  ;argument number 
pop ebx  ;program name 
pop ebx  ;pointer to the first argument 

mov ecx,ebx ;load the pointer into ecx for the write system call 

mov eax,4 ;load the other registers for the write system call 
mov ebx,1 
mov edx,3 
int 80h 

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

啊,我明白了。我正在加載指向test_string的指針。所以,而不是我應該做的mov ecx,[test_string] – b10hazard

+0

爲什麼'只彈出ebx'到'mov ecx,ebx'?我認爲你可以'pop ecx',並消除'mov ecx,ebx'。 – 2015-12-19 19:49:24