Linux 32位NASM汇编中数据寄存器(EDX)工作原理问询
x86 Linux系统调用中EDX寄存器的作用解析
你的代码是32位Linux下基于int 0x80的系统调用,这类系统调用的参数传递遵循内核约定的寄存器用法,和寄存器的通用算术/I/O功能是完全独立的场景,这是你困惑的核心。
关于mov edx, mes_len的解释
mes_len是通过equ $ - message计算出的常量,代表message字符串的总字节数(包括换行符10和终止符0)。在sys_write系统调用(对应eax=4)中,EDX的作用是指定要写入的字节长度,而非存储消息地址。
32位Linux int 0x80系统调用的参数约定(以sys_write为例)
执行int 0x80触发系统调用时,各寄存器的作用由EAX中的调用号决定:
- EAX:存储系统调用号(
4对应sys_write,1对应sys_exit),和消息地址完全无关 - EBX:第一个参数,文件描述符(
1表示标准输出stdout) - ECX:第二个参数,要写入数据的起始内存地址(对应代码中的
message) - EDX:第三个参数,要写入的字节长度(对应
mes_len)
EDX通用功能与系统调用用法的区别
你查到的EDX用于乘除运算、I/O操作是它的通用指令场景:
- 乘法/除法指令(如
mul、div)中,EDX配合EAX处理64位运算的高32位结果 - I/O指令(如
in、out)中,DX用于存储I/O端口地址
但在int 0x80系统调用中,寄存器的用途是内核预先约定的,和通用功能不冲突,只是应用场景不同。
补充说明
你的代码中message末尾的0(空字符)其实没必要,因为sys_write会严格按照EDX指定的长度输出,不会自动处理字符串终止符。如果只想输出"Hello, World\n",可以去掉0,此时mes_len会自动计算为13(12个字符+1个换行)。
内容的提问来源于stack exchange,提问作者Yelnat
相关产品推荐
相关产品推荐

