2

実行可能ファイルに渡されたファイル名を読み取り、アセンブリを使用してそのファイルに書き込もうとしています。エラーなしでコンパイルされますが、実行すると失敗します。私のコードの何が問題になっていますか?

BITS 32
segment .data
text db "text"

segment .text

global main

main:
pop ebx 
pop ebx
pop ebx    ; pop pointer to filename into ebx
mov eax,0x5  ;syscall open
mov ecx,0x2   ;flag read/write
int 0x80   ;call kernel
mov ebx,eax   ;save returned file descriptor
mov eax,0x4 ; write syscall
mov ecx,text ;mov pointer to text into ecx
mov edx,0x4 ;string length
int 0x80  ;exit syscall
mov eax,0x1
int 0x80
4

2 に答える 2

5

あなたはlibcから呼び出されているので、そこに戻ることができるようにリターンアドレスがあることも思い出さなければなりません。これは、最低限のアセンブリ プログラム (多くのチュートリアルのように!) を持っている場合に得られるものとは異なります。それを念頭に置いて:

pop ebx    ;; pops return address to libc caller (_start usually)
pop ebx    ;; pops argc
pop ebx    ;; pops argv !!WAS!!: ; pop pointer to filename into ebx

最初の引数を出力する方法は次のとおりです。あなたはそこから行くことができるはずです(注意してください:私は間違いを犯したかもしれません):

    BITS 32

    section .text
    global main
    extern strlen

main:
    pop ecx ; Return address
    pop ecx ; argc
    pop ecx ; argv 
    mov ecx, [ecx+4] ; argv[1]

    push ecx
    call strlen
    mov edx, eax ; count
    pop ecx ; buf

    mov eax, 4 ; sys_write
    mov ebx, 1 ; stdout
    int 0x80

    mov eax, 1 ; sys_exit
    mov ebx, 0 ; status
    int 0x80
于 2011-10-21T20:44:37.413 に答える
2

メインへのエントリ時: スタックには次のものがあります。

...
*envp[]
*argv[]
argc
return address

pop ebx3 回実行すると、argvではなく argv[1]にアクセスすることになります。

argv@ user786653 が示すように、 は の NULL で終わる配列へのポインタであるchar *ため、間接指示に従わなければなりません。

于 2011-10-21T20:47:02.220 に答える