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

NASM转MASM:空宏SLDR及_m后缀寄存器含义咨询

NASM转MASM:SLDR空宏与带_m后缀符号的疑问

正在将NASM汇编代码移植到MASM时,遇到两个关键问题:带双参数的空宏SLDR,以及带_m后缀的符号用法。示例代码如下:

;register defines
%define arg0   rcx
%define arg4   r12
%define tmp4   r14
%define len    arg0
%define dest1  arg4
%define dest2  tmp4
%define PS     8

;empty macro
%macro  SLDR 2
%endmacro
%define SSTR SLDR

; example usage in code:

        SLDR    len, len_m
        sub     len, 16
        SSTR    len_m, len
        jl      .return0

;...

        SLDR    dest1, dest1_m
        mov     dest2, [dest1+PS]
        SSTR    dest2_m, dest2
        mov     dest1, [dest1]
        SSTR    dest1_m, dest1

推测带_m后缀的参数是宏生成的名称,且假设它们不在栈上,请问这些参数代表什么?


分析与结论

  1. 关于SLDR/SSTR宏:
    示例里的SLDR是空宏,但从代码用法(SLDR 寄存器, _m符号、SSTR _m符号, 寄存器)来看,它原本应该是实现寄存器值保存/恢复的宏——比如把寄存器的值存储到指定内存位置,或者从内存位置恢复到寄存器。空宏可能是示例简化,或是原代码依赖特定环境的宏定义。

  2. 带_m后缀的符号:
    这些符号并非寄存器,而是用来暂存对应寄存器值的内存位置(比如全局变量、线程本地存储槽位),一一对应关系如下:

    • len_m:暂存len(即rcx寄存器)的值
    • dest1_m:暂存dest1(即r12寄存器)的值
    • dest2_m:暂存dest2(即r14寄存器)的值

    代码里的SLDR len, len_m是把rcx的值存入len_m,SSTR len_m, len则是把len_m中的值写回rcx,其他SLDR/SSTR调用的逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:42:44