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 在汇编语言中编译C随机函数_Assembly_Random_Linker_Nasm - Fatal编程技术网

Assembly 在汇编语言中编译C随机函数

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

有谁能告诉我如何使用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
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