GNU Assembler .print如何输出表达式求值结果
让GAS
.print 指令输出表达式计算值的正确方案 未拿到预期输出的核心原因是没有正确使用.altmacro模式下的%expr语法:
- 开启
.altmacro后,必须在需要求值的表达式、自定义符号前加%前缀,汇编器才会先完成表达式求值,再将结果转为字符串传入.print - 缺省
%前缀时,汇编器只会对标识符做普通宏替换,你用LOCAL定义的标签会被替换为内部生成的.LLxxxx格式临时符号,也就是你之前看到的异常输出。
最简可运行示例
不需要封装宏,开启.altmacro后直接用%前缀引导表达式即可:
.altmacro .print "Hello" .print %1+2
汇编时的输出完全匹配预期:
Hello 3
修正你的宏测试代码
原有宏逻辑存在两个问题:一是将符号名写在了双引号内(引号内内容会被识别为普通字符串直接输出,不会触发替换/求值),二是引用求值符号时未加%前缀,修正后代码如下:
.altmacro .macro myMacro LOCAL myLabel .set myLabel, 1+2 .print %myLabel .endm myMacro
运行修正后的代码会直接输出计算结果3,不会再打印内部临时标签名。
使用注意点
%expr转义规则仅在.altmacro模式下生效,必须在使用该语法前通过.altmacro指令开启对应模式- 带
%的求值表达式不要放在双引号内,避免被识别为普通字符串跳过求值逻辑 - 包含多步运算的复杂表达式建议用圆括号包裹明确运算顺序,例如
%(2 * (3 + 5)),避免因运算优先级规则导致求值结果不符合预期
内容的提问来源于stack exchange,提问作者Citra Dewi
相关产品推荐
相关产品推荐

