Tag: nasm

CTypes错误加载调用另一个DLL的DLL

编辑:我在DLL调用Python C / API时发布了部分解决方案来解决这个问题。 这篇文章显示了所涉及的源代码,但似乎源代码不是问题。 我正在使用CTypes来调用在Windows中调用64位C DLL的NASM 64位DLL,但是当我尝试使用CTypes加载它时,我得到“[WinError 126]无法找到指定的模块。” 这两个DLL正确编译并链接在一起,没有编译器或链接器错误,但CTypes无法加载C dll。 我知道这个错误是因为从NASM dll中调用C dll,因为当我消除C调用时,CTypes会加载NASM dll。 研究表明这是一个路径问题。 C dll与NASM dll位于同一文件夹中,它们从该路径链接在一起。 我还将C dll复制到CTypes程序所在的Python文件夹中,但是没有修复它。 当C dll与NASM dll位于同一文件夹中时,为什么会出现路径问题? NASM代码使用NASM编译并与GoLink链接。 C dll在MSYS2中编译并与GCC链接。 这是NASM代码: ; Header Section [BITS 64] [default rel] export Main_Entry_fn extern DllMain section .data align=16 lib_pass_value: dq 0 lib_return_value: dq 0.0 filename: db “Python_Program.py” modulename: db “Test_For_C_API” section […]

C使用float调用32位到NASM的约定(movups / movupd difference)

我在C中使用了这个函数。当我使用像:movss,movaps,movups这样的函数时,所有工作都是正确的,而当我使用像:movupd,movapd,ecc这样的函数时…它不起作用..并返回奇怪的值 与movaps,movups,ecc一起工作的代码。 C: extern float test(float* a,float* b, int num, int spuri, float* res); int main(int argc, char** argv) { float a[] = { 1.0, 2.0, 3.0, 4.0, 6.0, 9.0 }; float b[] = { 3.0, 4.0, 4.0, 5.0, 5.0, 8.0 }; int d=6; int num=d/4; int spuri=d-(num*4); float res=-1.0; test(a,b,num,spuri,&res); printf(“res: %f\n”,res); return 1; […]

从C调用x86-64上的NASM时返回值错误

我在Linux 64位上学习NASM,并且一直在尝试实现一些代码示例。 但是我在下面的示例中遇到了问题。 函数donothing在NASM中实现,并且应该在用C实现的程序中调用: 文件main.c: #include #include int donothing(int, int); int main() { printf(” == %d\n”, donothing(1, 2)); return 0; } 提交first.asm global donothing section .text donothing: push rbp mov rbp, rsp mov eax, [rbp-0x4] pop rbp ret 什么不做只不过是返回第一个参数的值。 但是当调用donothing时,将打印值0而不是1.我尝试了rpb + 0x4,但它也不起作用。 我使用以下命令编译文件: nasm -f elf64 first.asm && gcc first.o main.c 使用gcc -s在C中编译函数’test’,生成的汇编代码用于获取参数类似于donothing: int test(int […]

如何从汇编例程调用C函数并使用nasm和gcc链接C和汇编文件

我想从汇编中调用至少1个C函数。 这是因为我从头开始做我自己的小操作系统(无中生有)。 我想从我的启动加载程序调用c函数的原因。 我可以理解集会,但写自己的程序很差。 因此,如果我可以将控制从assembly程序转移到c程序,我的工作就变得更容易了。 那么如何将程序集pgm和C程序文件链接成一个。 即使文件大小超过512字节,也可以。 我在mingw的帮助下在Windows 7上这样做。 我的c编译器是gcc ,汇编器是nasm 。

为什么在调用printf时会覆盖EDX的值?

我写了一个简单的汇编程序: section .data str_out db “%d “,10,0 section .text extern printf extern exit global main main: MOV EDX, ESP MOV EAX, EDX PUSH EAX PUSH str_out CALL printf SUB ESP, 8 ; cleanup stack MOV EAX, EDX PUSH EAX PUSH str_out CALL printf SUB ESP, 8 ; cleanup stack CALL exit 我是NASM汇编程序和GCC,用于将目标文件链接到linux上的可执行文件。 本质上,该程序首先将堆栈指针的值放入寄存器EDX,然后将该寄存器的内容打印两次。 但是,在第二次printf调用之后,打印到stdout的值与第一个不匹配。 这种行为似乎很奇怪。 […]

使用外部c代码编译asm引导加载程序

我在asm中编写了一个引导加载程序,并希望在我的项目中添加一些已编译的C代码。 我在这里创建了一个测试函数: test.c的 __asm__(“.code16\n”); void print_str() { __asm__ __volatile__(“mov $’A’ , %al\n”); __asm__ __volatile__(“mov $0x0e, %ah\n”); __asm__ __volatile__(“int $0x10\n”); } 这是asm代码(引导加载程序): hw.asm [org 0x7C00] [BITS 16] [extern print_str] ;nasm tip start: mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov si, name call print_string mov al, ‘ ‘ […]

将C函数的值返回给ASM

我正试图从ASM中调用一个函数。 我知道如何调用它,但我很难找到如何获得此函数的返回值。 一个例子如下: C代码: int dummy() { return 5; } (N)ASM代码: dummyFunction: call dummy ;grab return into eax inc eax ; eax should be 6 now ret 有任何想法吗?

如何使用内核创建可启动CD映像?

我有一个内核,要启动我正在使用命令qemu-system-i386 -kernel kernel.bin 。 有没有办法用qemu-system-i386 -cdrom CD.iso创建可引导的磁盘映像? 我在linux中用这些命令编译的代码: nasm -f elf32 kernel.asm -o kernelasm.o gcc -m32 -c kernel.c -o kernelc.o ld -m elf_i386 -T link.ld -o kernel.bin kernelasm.o kernelc.o 然后使用qemu-system-i386 -kernel kernel.bin 代码:kernel.asm: [BITS 32] SECTION .text align 4 dd 0x1BADB002 dd 0x00 dd – (0x1BADB002 + 0x00) global start global keyboard_handler global read_port global […]

在编写汇编函数时,序言和尾声是强制性的吗?

最近我在汇编中重写了一些libc函数,对于其中一些(不需要任何调用或系统调用指令的那些,如strlen),我丢弃了序言和尾声,因为没有它我的测试没有失败(也许我没有足够复杂的测试)。 在同行评审期间,有人告诉我丢弃它是一种不好的做法,但无法解释为什么。 那么,当我调用没有prologue / epilogue组合的asm函数时,我遇到了问题吗? 即使堆栈上不需要额外的空间,添加它也是一个好习惯吗? 如果出于某些原因强制要求,为什么编译器(我使用过nasm)不会处理它? 谢谢阅读

内联汇编跳转错误

一旦Masm达到jmp,为什么会失败呢? struct gdt_entry { unsigned short limit_low; unsigned short base_low; unsigned char base_middle; unsigned char access; unsigned char granularity; unsigned char base_high; }; struct gdt_ptr { unsigned short limit; unsigned int base; }; struct gdt_entry gdt[3]; struct gdt_ptr gp; void gdt_flush() { __asm{ lgdt [gp] mov ax, 0x10 mov ds, ax mov es, ax mov […]