微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GAS 到 NASM 程序集:将“.rept .set”转换为 NASM循环并为标签分配递增值

如何解决GAS 到 NASM 程序集:将“.rept .set”转换为 NASM循环并为标签分配递增值

GAS 程序集知道 .set 指令,它可以与 .rept 组合以在循环中递增标签(变量),如下例所示:

pd:
  .set SPAGE,0
  .rept 512
    .quad SPAGE + 0x87      // PRESENT,R/W,USER,2MB
  .set SPAGE,SPAGE + 0x200000
  .endr

如何在 NASM 中实现类似的方便?我知道 TIMES 指令,但这并不能帮助我实现我想要的。有任何想法吗?来自 NASM 的 EQU 指令只允许赋值一次。因此,它不能解决我的问题。

解决方法

实际上这是不可能用times指令做的,因为TIMES的操作数是一个critical expression,要重复多行代码或复杂的宏,使用预处理器{{3 }} 指令,看看这个愚蠢的例子:

global    _start

section   .text
_start:
mov       rbx,0
%assign i 0
%rep    5
        mov rbx,[variable]
        add rbx,i
        mov [variable],rbx
%assign i i+1
%endrep

mov       rax,60                 ; system call for exit
mov       rdi,[variable]; value of 'variable' = 10
syscall

section .bss
variable: resb 1

检查答案:

nasm -felf64 ass.asm && ld ass.o && ./a.out
echo $?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。