Nasm 代码 运行 在 windows 但不在 linux

Nasm code running on windows but not on linux

我尝试 assemble 和 link 我老师的 NASM 代码,但它在我的 linux (Ubuntu 16.03) 上不起作用在她的电脑上工作 (Windows)

segment .data
a dw 10
segment .bss
segment .text
global _main:
extern _printf
_main:
_b100: mov eax, 10
_b150: mov eax, a
_b200: mov ebx, eax
fin:
ret

这些是我遵循 assemble 代码

的说明
nasm -g -f elf32 test.asm;ld -m elf_i386 -s -o demo *.o

ld returns 一个错误

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080

不管错误的影响,每次我 运行 命令都会生成可执行文件,但是当我想用 gdb 在程序上执行断点时,我不能。

首先,代码需要为 linux 打补丁:

-global _main:
+global main

-_main:
+main:

main 符号中删除下划线。同样在 global 指令中不要添加冒号,这是在指定新标签时需要的。

删除下划线也将适用于其他外部符号,例如 printf 或者当您使用 global.

将函数从 asm 发布到 C 时

正在编译:

nasm -g -felf32 -Fdwarf test.asm; gcc -m32 -o demo test.o

并且您需要安装 nasmgcc 和 32 位库,不确定最小的软件包集是什么,但是 sudo apt-get install nasm gcc gcc-multilib 可能就足够了*buntu 的全新安装。