You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:14:59