如何从程序集x86中的文件中读取

时间:2016-05-06 20:10:40

标签: c assembly x86

我有一个c语言的代码需要转换为程序集x86。 这是c代码:

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

任何人都可以帮我解决这个问题吗? :)

1 个答案:

答案 0 :(得分:0)

Gcc和Clang都可以为你生成声明。它可能并不总是很容易阅读,但这是如何做到的:

将要检查的代码段编译为可编译且没有错误。注意,我已经改变了你的例子,将一个整数的指针作为一个参数,因为在你的例子中,你在堆栈上声明了一个字符,然后返回它,即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; 
}

使用S标志将其编译为gcc ie

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

打开以下文件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上安装了所需代码的汇编程序。注意,你可以使用各种选项来改变输出,特别是优化级别会大大改变输出。

相关问题