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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:36:06