assembly - 使用 qemu 运行二进制文件

标签 assembly arm qemu

我正在我的一门类(class)中学习 arm 汇编语言。我在开始时没有什么问题。我写了一个简单的c代码:

int main()
{
    int a = 10;
    int b = 20;
    int c = a+b;
}

然后我通过给出命令使用 gnu arm 将其转换为汇编代码:
arm-elf-gcc -S first.c

这生成了一个包含汇编代码的文件 first.s:
    .file   "first.c"
    .text
    .align  2
    .global main
    .type   main, %function
main:
    @ args = 0, pretend = 0, frame = 12
    @ frame_needed = 1, uses_anonymous_args = 0
    mov ip, sp
    stmfd   sp!, {fp, ip, lr, pc}
    sub fp, ip, #4
    sub sp, sp, #12
    mov r3, #10
    str r3, [fp, #-16]
    mov r3, #20
    str r3, [fp, #-20]
    ldr r2, [fp, #-16]
    ldr r3, [fp, #-20]
    add r3, r2, r3
    str r3, [fp, #-24]
    mov r0, r3
    sub sp, fp, #12
    ldmfd   sp, {fp, sp, pc}
    .size   main, .-main
    .ident  "GCC: (GNU) 3.4.3"

然后我使用以下命令编译了汇编代码:
arm-elf-gcc -g first.s

这生成了 a.out 二进制文件。然后我尝试使用以下命令使用 qemu 运行 a.out:
qemu-arm a.out

但这会产生输出
Segmentation fault

我找不到错误,我做错了什么?

最佳答案

您正在尝试在用户模式下运行 qemu。您还需要链接对应于 arm 的库。

看看下面 pkg 中的脚本文件。

http://wiki.qemu.org/download/linux-user-test-0.3.tar.gz

您将需要运行 qemu -L library_PATH_ARM ./a.out

关于assembly - 使用 qemu 运行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882505/

相关文章:

assembly - 在此 x86 指令中, %r11d 中的 d 指的是什么?

c - C 源代码中使用的链接器变量的“ undefined reference ”

assembly - ARM IT条件指令汇编器(armcc)

qemu - 如何在 QEMU 中模拟 SATA 磁盘驱动器

c - MIPS 代码周期时间

assembly - 在内存中彼此相邻的 NASM 标签中,打印两个字符串而不是第一个字符串

rust - 为什么我不能在 QEMU 中启动自定义内核?

ubuntu-16.04 - 如何通过 qemu 命令行将 block 设备附加到 qemu VM?

c++ - GNU C 内联汇编中的输入操作数 `"m"(var )` and Output Operand ` "=m"(var)` ?不使用任何指令作为屏障?

linux - oracle云ubuntu 20连接被拒绝