NASM中的ALIGN ALIGNB SECTALIGN

ALIGN与ALIGNB

NASM中的ALIGN与ALIGNB是用来字节对齐的,它们接收2个参数,第一个参数是必须的,表示对齐的字节数(必须是2的幂),第二个参数是可选的,表示为了对齐而进行填充的内容,如果不提供,默认用NOP填充(等价于RESB 1)。

align   4               ; align on 4-byte boundary        
align   16              ; align on 16-byte boundary        
align   8,db 0          ; pad with 0s rather than NOPs         
align   4,resb 1        ; align to 4 in the BSS         
alignb  4               ; equivalent to previous line

ALIGN和ALIGNB可以在struct中使用:

struc mytype2   
    mt_byte:        
       resb 1        
       alignb 2   
    mt_word:         
        resw 1         
        alignb 4  
    mt_long:         
        resd 1  
    mt_str:         
       resb 32 
endstruc    

需要注意的是,ALIGN和ALIGNB对齐的起始点是相对于当前SECTION的,而不是整个可执行文件的地址空间。

SECTALIGN

SECTALIGN是用来对SECTION进行字节对齐的。

在进行SECTION定义的时候,可以使用align=属性来进行字节对齐,而SECTALIGN macro不同,它可以在任何时候进行字节的对齐。

一旦使用了SECTALGIN,对齐字节数只能增加,不能减少。比如SECTALIGN 16之后,就无法SECTALIGN 8。

ALGIN和ALIGNB底层默认都是调用的SECTALIGN,如果想关闭这个默认实现,可以调用SECTALIGN OFF,如果想打开调用SECTALIGN ON。调用SECTALIGN ON/OFF只是关闭ALIGN和ALIGNB的默认实现,不影响SECTALIGN的使用。

原文地址:https://www.cnblogs.com/chaoguo1234/p/14621884.html