2016-05-06 4 views
0

アセンブリ言語に変換する必要があるC言語のコードがあります。ここ はCコードです:アセンブリのファイルから読み取る方法x86

int rb (FILE *f){ 
    int s; 
    char c; 
    s = fr(&c, 1, 1, f); 
    if (s <= 0) return -1; 
    return (int)c; 
} 

これまでのところ、私は私のセグメンテーションフォールトを与え、このアセンブリコードに着い:

rb: 
    pushl %ebp 
    movl %esp,%ebp 
    pushl 8(%ebp) 
    pushl $1 
    pushl $1 
    leal 12(%ebp), %eax 
    pushl %eax 
    call fr 
    jz ng 
    jns ex 
ng: 
    pushl $1 
    negl %eax 
ex: 
    popl %ebp 
    ret 

誰も私がこの問題を解決するのに役立つことはできますか? :)

+2

'c'を割り当てるのを忘れて、' 12(%ebp) 'を使うのは忘れてしまいます。これは存在しない第二引数のアドレスになります。また、実際に 'call fr'の後に' eax'に基づいてフラグを設定する必要があります。 – Jester

+0

私はあなたに尋ねるかもしれません、なぜですか? –

+0

GCC(および一般にすべてのCコンパイラ)は、このような機能を提供しています(Cをアセンブリに変換する)。 –

答えて

0

GccとClangの両方があなたのためにassemberを生成できます。読むことは必ずしも容易ではないかもしれませんが、これを行う方法です。

エラーなしでコンパイル可能なスニペットを作成します。スタックにcharを宣言してから、Undefined Bahaviourを返すため、例では引数として整数へのポインタを取るように変更しました。

それにこれでfoo.cというファイルを作成します。

#include <stdio.h> 
extern size_t fr(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); 
int rb (FILE *f, int *c){ 
    int s; 
    s = fr(c, 1, 1, f); 
    if (s <= 0) return -1; 
    return *c; 
} 

開いて、次のファイル

gcc-5 -S -O0 -Wall -pedantic -std=c11 foo.c 

GCCすなわちにSフラグを使用して、それをコンパイルしfoo.s

.text 
    .globl _rb 
_rb: 
LFB1: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    subq $32, %rsp 
    movq %rdi, -24(%rbp) 
    movq %rsi, -32(%rbp) 
    movq -24(%rbp), %rdx 
    movq -32(%rbp), %rax 
    movq %rdx, %rcx 
    movl $1, %edx 
    movl $1, %esi 
    movq %rax, %rdi 
    call _fr 
    movl %eax, -4(%rbp) 
    cmpl $0, -4(%rbp) 
    jg L2 
    movl $-1, %eax 
    jmp L3 
L2: 
    movq -32(%rbp), %rax 
    movl (%rax), %eax 
L3: 
    leave 
LCFI2: 
    ret 
LFE1: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
.... 
.... snipped 
.... 

今度はx86上にアセンブラがありますあなたが望むコードのために。出力を変更するためにさまざまなオプションを使用して遊ぶことができます。特に、最適化レベルによって大幅に出力が変更されます。

関連する問題