2012-05-02 7 views
-1

私のcharポインタを取得する必要があり、その後、画面上にそれを印刷してOKかどうかを確認します。 私はファイルからテキストを読んで、私のcharポインタ(sizeof(char *)+ filesize)+ 1を入れます。最後に '\ 0'を入れます。 私は私の文字をprintfの場合*その細かい 私はそれを実行する私はちょうど私の変数にゴミを見たときにここに私のasmコードアセンブラ関数でcharポインタを取得する

; void processdata(char* filecontent); 
section .text 
    global processdata 
    extern printf 
section .data 
FORMAT: db '%c', 10, 0 ; to break the line 10, 0 
processdata: 
    push ebp 
    mov ebp, esp 
    mov ebx, [ebp] 
    push ebx 
    push FORMAT 
    call printf 
    add esp, 8 

です。紫よう

は言った:

; void processdata(char* filecontent); 
section .text 
     [GLOBAL processdata] ;global processdata 
     extern printf 
section .data 
FORMAT: db '%c', 0 
EQUAL: db "is equal", 10, 0 
processdata: 

    lea esi, [esp] 
    mov ebx, FORMAT 
oook: 
    mov eax, [esi] 
    push eax 
    push ebx 
    call printf 
    inc esi 
    cmp esi, 0x0 
    jnz oook 

おかげで、Linux上で

+0

)何あなたはそれが表示されることを期待していますか?スタック上に '[ebp]'である 'ebx'をpushして' char'として表示しようとしています。私はそれが実際にリターンアドレスだと思う。 –

+0

はい、どのように私は1つずつ印刷することができるようにcharポインタを取得できますか? – Lefsler

+0

charのポインタは何ですか? –

答えて

1

引用demonofnight

により、スタックポインタを修正するが、私はインクリメントする必要がある場合は、私ができますそれを行う?

lea esi, [esp+4] 
    mov ebx, FORMAT 
oook: 
    mov eax, [esi] 
    push eax 
    push ebx 
    call printf 
    inc esi 
    cmp [esi], 0x0 
    jnz oook 


[編集:SRY [OK]を、私はそれをハッキングすばやくいくつかのshenziのWinOSインライン__asmブロックへ]

char*のあなたの元の関数引数とあなたの%cフォーマット、このようなものを使用します ここではlinuxとnasmで行われた完全なことがあります:

; ---------------------------------------------------------------------------- 
; blah.asm 
; ---------------------------------------------------------------------------- 

     extern printf 


     SECTION .data     ;local variables 
     fmt: db "next char:%c", 10, 0 ;printf format, "\n",'0' 


     SECTION .text     ;hack in some codes XD 
     global foo 

foo:         ;foo entry 
     push ebp      ;set up stack frame 
     mov ebp,esp 

     mov esi, [ebp+8]    ;load the input char array to the source index 

oook:         ;loop while we have some chars 
     push dword [esi]    ;push next char addy in string to stack 
     push dword fmt     ;push stored format string to stack 

     call printf 

     add esp, 8     ;restore stack pointer 
     inc esi      ;iterate to next char 
     cmp byte [esi], 0    ;test for null terminator byte 
     jnz oook 

     mov esp, ebp     ;restore stack frame 
     pop ebp 

     mov eax,0      ;return 0 
     ret        ;done 


blah.c(つまり.ASM fooのを起動します):ここ

/*----------------------------------------------- 
blah.c 
invokes some asm foo 
------------------------------------------------*/ 
#include <stdio.h> 

void foo(char*); 

int main() { 

    char sz[]={"oook\n"}; 
    foo(sz); 

    return 0; 
} 


&は、コマンドラインのものです:

$ nasm -f elf blah.asm -o blah.o 
$ gcc -o blah blah.c blah.o 
$ ./blah 
next char:o 
next char:o 
next char:o 
next char:k 
next char: 

$ 
$ nasm -v 
NASM version 2.09.08 compiled on Apr 30 2011 

$ uname -a 
Linux violet-313 3.0.0-17-generiC#30-Ubuntu SMP Thu Mar 8 17:34:21 UTC 2012 i686 i686 i386 GNU/Linux 


が、それはあなたのために働くホープ;

+0

元の投稿で何が変わったのかな? – Lefsler

0

は、最初の関数のパラメータがecxであるはx86。ポインタを印刷するprintf形式は"%p"です。

だから

... 
    FORMAT: db '%p', 10, 0 ; to break the line 10, 0 
processdata: 
    mov eax, [esp+4] 
    push eax 
    push format 
    call printf 
    add esp, 8 
    ret 

に沿って何かがあなたのコードの残りの部分を想定し、作業正しく、あなたは、GCCの呼び出し規約を使用している必要があります。

これは、印刷するポインタがスタック上にあることを前提としています。

クラッシュの理由は、あなたがスタック上に12のバイトをプッシュすることはおそらくですが、唯一の8

+0

いくつかの乱雑な文字とセグメンテーションエラーが返されます。 gccの呼び出し規約は何ですか? – Lefsler

+0

申し訳ありませんが、どのように私は、アセンブリ言語で初めてです – Lefsler

+0

はい、表示されます。あなたが書いたルーチンはすべて間違いです。 – hirschhornsalz

関連する問題