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

x86-64汇编print_char实现中rdx寄存器的作用疑问

关于汇编print_char函数中rdx寄存器作用的解答

你编写的是x86_64架构Linux平台的汇编代码,使用Linux系统调用完成字符打印,逻辑完全符合系统调用的参数规范:


1. Linux x86_64 系统调用参数传递规则

系统调用的参数按顺序对应寄存器如下:

  • 第1个参数:rdi
  • 第2个参数:rsi
  • 第3个参数:rdx
  • 第4个参数:r10
  • 第5个参数:r8
  • 第6个参数:r9
  • 系统调用号存储在rax寄存器中

2. write系统调用的原型对应

你使用的rax=1对应的是write系统调用,它的C语言原型为:

ssize_t write(int fd, const void *buf, size_t count);

三个参数的含义分别是:

  • fd:要写入的目标文件描述符,标准输出stdout的描述符固定为1
  • buf:要写入内容的内存起始地址
  • count:要写入的字节总长度

3. 代码中各寄存器的对应逻辑

逐行对应参数即可理解rdx的作用:

print_char:
    push rdi          ; 把传入的单字符编码压入栈,此时rsp指向该字符的内存地址
    mov rsi, rsp      ; 第二个参数buf:取栈上字符的地址作为写入缓冲区起始地址
    mov rdx, 1        ; 第三个参数count:指定要写入的字节长度为1,刚好对应单个字符的大小
    mov rdi, 1        ; 第一个参数fd:指定写入目标为标准输出
    mov rax, 1        ; 系统调用号指定为write
    syscall           ; 触发系统调用
    pop rdi
    ret

rdx的作用和字符串打印场景完全一致:永远表示要写入的字节总长度。内核的write实现不区分你写入的是单个字符还是长字符串,只会按照你指定的长度,从buf起始地址读取对应数量的字节输出到目标文件。如果此处你把rdx设置为大于1的值,内核就会额外读取栈上后续地址的字节打印,会出现预期外的乱码内容。


内容的提问来源于stack exchange,提问作者i_am_so_tired

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:54:08