2013-02-23 111 views
0

我有一個基本的asm程序,用於檢查字符串是否是數字。我在代碼中添加了從命令行參數中讀取的內容,並將其保留爲seg錯誤。從x86 asm訪問linux命令行參數的問題

如果我讀的是正確的,這應該得到傳遞給程序的參數的數量,它應該存儲在0(%ebp)中。我究竟做錯了什麼?

代碼的安全性可以在這裏找到:http://pastebin.com/kGV2Mxx4 問題是_start的前3-5行。

查看lscpu的輸出,我有一個i868 cpu。雖然它說它可以在32位和64位操作。我正在運行32位Linux(Arch linux x86)

我修復了這個問題。我做了兩個流行的,一個繞過程序名稱,另一個獲得第一個參數。更新後的代碼可以在這裏找到:http://pastebin.com/xewyeHYf

有人能告訴我爲什麼我不能只是做到以下幾點:

pushl 8(%ebp) 

movl 8(%ebp), %eax 
+3

向我們顯示您的代碼。我們不是全能的。 – 2013-02-23 00:21:32

+1

您確定您使用的是32位Linux嗎? – 2013-02-23 00:57:12

回答

1

你可以這樣寫:

_start: 
b1: movl 0(%ebp), %eax 
    cmpl $1, %eax 
    je  load_msg 
b2: pushl 8(%ebp) 
b4: call check 

要理解您以前的嘗試不起作用的原因,請繪製堆棧圖。

0

編譯一個類似你想做的事情的小型C程序,並將其編譯爲彙編語言以準確找出如何訪問參數。該x86_32代碼不看都像任何上述情況,順便說一句:

int main(int argc, char *argv[]) 
{ 
    return argv[1][0]; 
} 

給出(是的,有些是多餘的堆棧記賬,但無論如何):

.file "tst.c" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    .cfi_startproc 
    pushl %ebp 
    .cfi_def_cfa_offset 8 
    .cfi_offset 5, -8 
    movl %esp, %ebp 
    .cfi_def_cfa_register 5 
    movl 12(%ebp), %eax 
    addl $4, %eax 
    movl (%eax), %eax 
    movzbl (%eax), %eax 
    movsbl %al, %eax 
    popl %ebp 
    .cfi_restore 5 
    .cfi_def_cfa 4, 4 
    ret 
    .cfi_endproc 
.LFE0: 
    .size main, .-main 
    .ident "GCC: (GNU) 4.7.2 20121109 (Red Hat 4.7.2-8)" 
    .section .note.GNU-stack,"",@progbits