x86-64 在线汇编,使用 IDE,例如 https://www.mycompiler.io/new/asm-x86_64

问题描述 投票:0回答:2

任何人都可以帮我编写与下面的程序等效的程序,以便它可以在https://www.mycompiler.io/new/asm-x86_64的在线IDE上运行吗? 我是一名老师,想向我的学生展示如此真实的工作组装,这样他们就不再认为小人计算机是真实的。 我只是现在没有时间自己解决这个问题!

section .text
    global main
    extern printf           ; the C function to be called
main:
 
    mov eax, 45
    mov ebx, 55
    add eax,ebx
    push eax
    push message
    call printf
    add esp, 8
    ret
 
message db "Value = %d", 10, 0

assembly ide x86-64
2个回答
2
投票

https://www.mycompiler.io/new/asm-x86_64显然没有为asm链接libc,所以你只能直接使用Linux系统调用(通过syscall

),而不是像printf这样的libc函数.

https://www.onlinegdb.com/有asm,但只有GCC(GAS),没有NASM。 尽管如此,您仍然可以使用 .intel_syntax noprefix

 来获取 GAS 的类似 MASM 的 Intel 语法。  
最重要的是,它确实有一个有效的 GDB 设置,可以让您单步执行 asm 并查看寄存器值。 这对于学习 asm 几乎是必不可少的:多种错误都会导致完全相同的错误(段错误或无输出),这些是汇编器无法诊断的错误。 在没有调试器的情况下学习汇编就像试图蒙住眼睛构建一个机器人(或其他丰富多彩的类比)。

准确地看到每条指令的作用就是

准确地您应该如何思考汇编,尤其是在尝试理解为什么您的程序没有执行您希望的操作时。


如果您

did想在不使用libc的情况下使用特定的IDE(mycompiler.io),如何在不使用c库中的printf的情况下在汇编级编程中打印整数?有将无符号整数转换为十进制ASCII的代码字符串并将其提供给 x86-64 Linux write

 系统调用,使用 
rax=1
 / 
syscall

extern exit

call exit
 组装但不链接,作为快速测试:
undefined reference to 'exit'

还有

https://tio.run/,其中有 NASM 和 FASM,以及 GAS。 FASM 允许通过让 FASM 直接生成可执行文件 (format ELF executable 3

) 而不是 TIO.run 期望能够链接到 64 位可执行文件的 
.o
 来生成 32 位代码。  我用它来测试一些代码高尔夫答案(
like this),其中我特别想要 32 位模式,而不是 64 位,所以我可以在指针上使用 dec edi
,而不需要 REX 前缀。


我注意到您尝试调用 printf 时使用的是 32 位堆栈参数调用约定。 这不是 x86-64 System V ABI 的工作方式(

i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么),所以请决定是否要教授32 位代码(具有更简单但更差的调用约定,几乎所有内容都可以是 32 位),或 x86-64,其中普通代码通常利用 32 位操作数大小和隐式零扩展至 64-少量。 参数在寄存器中传递到系统调用,其调用约定与函数调用类似。

相关:32位

你好,带有Linux系统调用的汇编语言世界?带有int 0x80

系统调用和大量解释。

此外,您不想在 64 位代码中使用

int 0x80

如果在 64 位代码中使用 32 位 int 0x80 Linux ABI 会发生什么?


0
投票
我怎样才能通过看到角色但获得以下来源来做到这一点

https://www.mycompiler.io/view/CS2cGydmOEN https://www.mycompiler.io/view/CS2cGydmOEN

© www.soinside.com 2019 - 2024. All rights reserved.