首先介绍下我使用的汇编IDE(估计很多人汇编都是用记事本写,手动滑稽)。

SASM汇编IDE,可以在windows上使用,也可以在linux上使用,我的win10物理机和ubuntu22.04虚拟机都使用的这个IDE,可以自己选择汇编器,linux下支持nasm,gas,fasm三种,而windows下的版本还增加了masm。我使用的是nasm汇编器。

从图上可以看出来,像其他IDE一样,支持断点调试,而且还可以显示寄存器的信息和内存的信息,不过有一点和正常的nasm汇编不同,那就是入口函数是main,而不是_start,这点在使用IDE时要注意,如果是命令行直接使用nasm编译,则是 _start作为入口函数,如果要在IDE和命令行之间切换,记得自己修改入口函数。

下面是hello world

section .data					; data段,数据段,用于保存全局变量
	msg db "hello world",0ah	; msg是变量名 db是msg的数据类型 字节类型,每个字符都是一个字节,最后的0ah是紧跟着字符串的一个ASCII码,可以视为字符串的一部分代表换行符
	len equ $-msg				; len是变量名,用于储存msg的长度,equ表示len代表后边的表达式 $代表当前段的偏移值,因为段中有了msg,所以$偏移了msg长度的大小,而用$减去msg的首地址,就得到了msg的长度

section .text					; text段,代码段,用于保存要执行的指令
global _start					; global让_start符号全局可见,两者放到一起就是给代码起始地址定义全局标记  linux寻找这个 _start 标签作为程序的默认进入点。
_start:
	mov eax,4d					; 因为此处为32位程序,所以系统调用中32位的4号函数为写
	mov ebx,1d					; 将文件描述符设为1 文件描述符1为标准输出
	mov ecx,msg					; 将写的首地址设为msg的首地址
    mov edx,len					; 将写的最大长度设为len
    int 80h 					; 执行系统调用
    
    mov eax, 1d					; 32位系统调用1号为退出
    mov ebx, 0d					; 将退出时的状态码设为0代表正常退出
    int 80h						; 执行系统调用

关于linux系统调用号,在此附上以为大佬整理好的链接

linux 系统调用号表_Anciety的博客-CSDN博客_linux系统调用号

以上就是32位的nasm汇编的hello world的代码及注释,如有问题,请留言或私信,谢谢。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐