初试nasm
二十余年过去了,课堂上学了又好像没学的汇编,昨今两日撞上了又试了试,教程上推荐linux环境安装nasm,简单试了试输出hi语句
(开始sasm图形界面编译不了,需执行sudo apt install libc6-dev),
终端编译语句记录如下:
nasm -f elf64 -g -F dwarf a.asm
ld -o a a.o
又琢磨win平台上怎么也得转一圈,安装试很顺利的,
nasm和sasm摸着鱼就装上了,测试语句却遇到问题,屡屡报错。记录如下:
1.输出win32和win64的汇编语句竟然有差异,比如
extern _printf
global _main ;可以在win32通过,win64过不了。
_main:
push msg
call _printf
add esp, 4
ret
;...................................................
extern puts
global main ; 可以在win64通过,win32过不了。
main:
sub rsp,20h
mov rcx,msg
call puts
add rsp,20h
ret
入场即入坑,转转也恍然。
2.mingw32和mingw64的gcc需分别匹配win32和win64编译产生的obj文件
cmd编译语句记录如下:
nasm -f win64 a.asm 或 nasm -f win32 a04.asm
gcc a.o -o a.exe
3.对汇编,win平台和linux平台差异大,同一段代码,在win32和win64生成的obj都gcc不了,在linux却没有问题:
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'

浙公网安备 33010602011771号