Assembly 在汇编语言中编译C随机函数
有谁能告诉我如何使用c函数编译汇编代码吗?我使用了rand()函数。当我编译程序时,它说我没有定义函数。我使用这些命令进行编译 nasm-f elf hello.asm ld-m elf i386-s-o你好你好Assembly 在汇编语言中编译C随机函数,assembly,random,linker,nasm,Assembly,Random,Linker,Nasm,有谁能告诉我如何使用c函数编译汇编代码吗?我使用了rand()函数。当我编译程序时,它说我没有定义函数。我使用这些命令进行编译 nasm-f elf hello.asm ld-m elf i386-s-o你好你好 有人能告诉我如何用rand()函数编译汇编程序吗?链接并初始化相应的库。通常可以通过编译一个详细程度很高的C示例来收集所需的链接器命令。下面是一个使用rand for x86_64并使用System V AMD64调用约定的示例: ;rand.asm extern printf ext
有人能告诉我如何用rand()函数编译汇编程序吗?链接并初始化相应的库。通常可以通过编译一个详细程度很高的C示例来收集所需的链接器命令。下面是一个使用rand for x86_64并使用System V AMD64调用约定的示例:
;rand.asm
extern printf
extern rand
extern _exit
section .data
hello: db 'rand %d',10
section .text
global _start
_start:
xor eax, eax
call rand
mov esi, eax
mov edi, hello
xor eax, eax
call printf
mov rax, 0
jmp _exit
像这样编译和链接
nasm -felf64 rand.asm
ld rand.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -melf_x86_64
这将产生与相同的结果
#include <stdio.h>
int main() {
int x = rand();
printf("rand %d\n", x);
return 0;
}
试试看ld hello.o-o hello-dynamic linker/lib/ld linux.so.2-lc-melf_i386它不太一样,是吗?C代码将在
main()
之前运行大量C库初始化,asm从\u start:
开始,不进行初始化。@EOF,我不确定“相同”是什么意思。它产生相同的输出。据我所知,所有C库初始化都由动态库负责。也许这就是你所想的?好吧,如果你在编译好的C可执行文件上运行objdump
,你可以看到在调用main()
之前已经进行了很多初始化。这不是对你的答案的抨击,只是要记住一些东西。@EOF,OP没有说他是否在给main打电话。我认为可以公平地假设他不是,因为他试图直接链接,而不是让GCC这样做。但是我用GCC-O3-S-masm=intel foo.C
编译了C代码(称之为foo.C),看看foo.S,我没有看到很多初始化操作。事实上,唯一的额外代码实际上是一些堆栈对齐(sub-rsb,开始时为8,然后添加rsb,最后为8)。真的gcc-S
不会显示ELF包含的所有自动生成的初始化代码。
ld rand.o -dynamic-linker /lib/ld-linux.so.2 -lc -melf_i386