任何人都可以帮我编写与下面的程序等效的程序,以便它可以在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
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 前缀。
i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么),所以请决定是否要教授32 位代码(具有更简单但更差的调用约定,几乎所有内容都可以是 32 位),或 x86-64,其中普通代码通常利用 32 位操作数大小和隐式零扩展至 64-少量。 参数在寄存器中传递到系统调用,其调用约定与函数调用类似。
相关:32位你好,带有Linux系统调用的汇编语言世界?带有int 0x80
系统调用和大量解释。此外,您不想在 64 位代码中使用
int 0x80
:如果在 64 位代码中使用 32 位 int 0x80 Linux ABI 会发生什么?