nasm:如何填充字符串的开头,使其在对齐边界处结束

我无法弄清楚如何填充字符串的开头,使其在对齐边界处结束:

%macro string 1
_unaligned:
; some preprocesor expression comes here
    db %1
_aligned:
%endmacro

经过几个小时的尝试不同的解决方案,我仍然没有任何解决方案。请问有人可以帮忙吗?

编辑:

这是它应该如何工作的真实示例(对于 32 位代码):

%define LAST 0

%macro xword 2
%strlen len %1
                ; pad - some preprocassor magic comes here
                db %1
NAME__%2        db len
LINK__%2        dd LAST ; must be aligned !!!
CODE__%2        dd code
PAR__%2
%define LAST PAR__%2
%endmacro

用法:

xword '测试',test01

创建结构(例如 $ = 0x0001):

0x0001  
0x0002  
0x0003  db 'T'
0x0004  db 'E'
0x0005  db 'S'
0x0006  db 'T'
0x0007  db 4
0x0008  dd 0    ; LAST (must be ALIGNED)
0x000C  dd code

不能有多余的填充,因为有必要尽可能多地节省内存。

回答

这应该可以工作,尽管它不是最理想的,因为在某些情况下它可能会增加不必要的填充:

%macro string 1
   %strlen numchars %1
   align 4, db 0
   times (4-numchars)&3 db 0
   db %1
   %%_aligned:   
%endmacro

将 4 替换为您想要的任何对齐(以及将 3 替换为您的对齐减 1)。


编辑:这是另一个版本,应避免添加不必要的填充:

%macro string 1
   %strlen %%numchars %1
   %%loc equ ($-$$)
   times (4-(%%loc+%%numchars))&3 db 0
   db %1
   %%_aligned:   
%endmacro

此版本假定您使用此宏的所有部分的开头至少与您要对齐数据的 2 的幂对齐。

  • Yeah, it doesn't mind, but it also generates a symbol `numchars`, polluting the namespace.

以上是nasm:如何填充字符串的开头,使其在对齐边界处结束的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>