我尝试组装并链接我的老师的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
这些是我按照说明组装代码的说明
nasm -g -f elf32 test.asm;ld -m elf_i386 -s -o demo *.o
ld返回错误
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
无论错误的影响如何,每次运行命令时都会生成可执行文件,但是当我想使用gdb在程序上执行断点时我无法做到。
答案 0 :(得分:3)
首先,代码需要对linux进行一些修补:
main
从global
符号中删除下划线。同样在printf
指令中,不要添加冒号,这是指定新标签时所需的。
删除下划线也适用于其他外部符号,例如global
或当您使用nasm -g -felf32 -Fdwarf test.asm; gcc -m32 -o demo test.o
将功能从asm发布到C时。
编译:
nasm
您需要安装gcc
,sudo apt-get install nasm gcc gcc-multilib
和32位库,不确定最小的软件包集合,但即使在干净安装上,.text()
也可能已经足够* buntu。