x86_64汇编实现字符串存储并将地址存入%rdi寄存器的方法问询
x86_64架构下实现字符串存储并加载首地址到%rdi的汇编方案
方案1:使用静态存储区(推荐,实现最简单)
直接在数据段预定义字符串,运行时直接加载地址即可:
- 只读场景下可将字符串放在
.rodata段,读写场景放在.data段,.string指令会自动在字符串末尾添加0x00结束符,刚好匹配你给出的编码31 32 33 34 35 36 00 - 加载地址到
%rdi可以用立即数赋值或者位置无关的lea写法
代码示例:
# 数据段定义字符串 .section .rodata str_123456: .string "123456" .text # 加载首地址到%rdi # 普通写法 mov $str_123456, %rdi # 位置无关代码(PIC)常用写法,兼容性更好 lea str_123456(%rip), %rdi
方案2:动态写入存储区域(如栈、堆空间)
如果需要运行时把字符串写入临时存储区,可以利用x86_64的小端字节序特性构造字符串数值写入内存,再把首地址赋值给%rdi:
你给出的字符串加结束符共7字节,刚好可以存入一个8字节寄存器一次性写入,也支持分段写入:
x86_64为小端字节序,内存低地址存储立即数的低字节,所以构造立即数时需要把字符串开头的字符放在立即数的最低位,比如第一个字符'1'的编码0x31对应立即数的最低8位。
一次性写入实现
# 栈上分配8字节存储空间 sub $8, %rsp # 小端模式下构造7字节字符串对应的立即数,写入栈空间 movq $0x00363534333231, (%rsp) # 栈顶即为字符串首地址,赋值给%rdi mov %rsp, %rdi # 后续使用完后平衡栈空间 # add $8, %rsp
分段写入实现
# 栈上分配8字节存储空间 sub $8, %rsp # 写入前4字节:0x31 0x32 0x33 0x34 movl $0x34333231, (%rsp) # 写入第5、6字节:0x35 0x36 movw $0x3635, 4(%rsp) # 写入末尾结束符0x00 movb $0x00, 6(%rsp) # 赋值首地址到%rdi mov %rsp, %rdi # 后续使用完后平衡栈空间 # add $8, %rsp
内容的提问来源于stack exchange,提问作者bugs_and_stars
相关产品推荐
相关产品推荐

