Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86-64程序集联机,带有IDE,如https://www.mycompiler.io/new/asm-x86_64_Assembly_Ide_X86 64 - Fatal编程技术网

Assembly x86-64程序集联机,带有IDE,如https://www.mycompiler.io/new/asm-x86_64

Assembly x86-64程序集联机,带有IDE,如https://www.mycompiler.io/new/asm-x86_64,assembly,ide,x86-64,Assembly,Ide,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 pus

有谁能帮我写下下面的程序,让它在在线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

显然没有将libc链接到asm,所以您只能直接使用Linux系统调用(通过
syscall
),而不能使用像printf这样的libc函数

有asm,但只有GCC(气体),而不是NASM。尽管如此,您仍然可以使用
.intel\u syntax noprefix
来获得GAS类似MASM的英特尔语法至关重要的是,它有一个有效的GDB设置,允许您单步执行asm并查看寄存器值。这对于学习asm几乎是必不可少的:许多类型的错误都会导致完全相同的错误(SEGFULT或无输出),而这些错误是汇编程序无法诊断的。在没有调试器的情况下学习asm就像试图在蒙着眼睛的情况下构建一个机器人(或其他色彩丰富的类比)

确切地看到每一条指令都做了什么,这正是您应该如何思考asm的,尤其是当您试图理解为什么您的程序没有达到您希望的效果时


如果您确实希望在不使用libc的情况下使用该特定IDE(mycompiler.io),则其代码可以将无符号整数转换为十进制ASCII字符串,并将其馈送到x86-64 Linux
write
系统调用,同时使用
rax=1
/
syscall

extern exit
允许
调用exit
组装而不是链接,作为快速测试:
未定义对“exit”的引用

还有NASM和FASM,还有气体。FASM允许通过让FASM直接生成可执行文件(
format ELF executable 3
)而不是TIO.run希望能够链接到64位可执行文件的
.o
来生成32位代码。我用它测试了一些代码高尔夫答案(),其中我特别想要32位模式,而不是64位模式,因此我可以在指针上使用
dec edi
,而不需要REX前缀


我注意到您在尝试调用printf时使用了32位堆栈args调用约定。这不是x86-64 System V ABI的工作方式(),所以请决定是教授32位代码(它有一个更简单但更糟糕的调用约定,几乎所有东西都可以是32位的),还是教授x86-64,其中普通代码通常利用32位操作数大小和隐式的64位零扩展。在寄存器中传递参数的地方,使用与函数调用类似的调用约定传递给系统调用

相关:32位,带
int0x80
系统调用和大量解释


另外,您不想在64位代码中使用
int 0x80

根据ABI的不同,一些参数,甚至对于可变参数函数(如
printf
),也可能使用寄存器传递。这并不像在线工具不允许您链接到libc那样简单。也许你选择了另一个?你可以试试。很高兴使用godbolt。我没有看到一种在那上面运行汇编代码的方法。这能回答你的问题吗@乌龟选择程序集作为源文件格式。请注意,这是GNU程序集,而不是NASM程序集。