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的描述符固定为1buf:要写入内容的内存起始地址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
相关产品推荐
相关产品推荐

