首页
社区
课程
招聘
[求助]关于masm32下的align详细的用法
发表于: 2007-6-13 13:06 7412

[求助]关于masm32下的align详细的用法

2007-6-13 13:06
7412
目前我知道的是,该伪指令可用于调整当前段之后的对齐方式:

常用于.code的第一行,或是位于某个函数内的一段proc中。如下:

1、.code。作用:常用于32位的CPU,主要是为了优化数据的I/O:
.code
align 4
....

2、一段<func> proc... <func> endp内。作用:用于优化存于栈中声明的局部变量,如表:

align 16
@PasswordTable:
....

我知道的就这样,主要是想更透彻的研究ASM,但在google和baidu上都很少这样的资料介绍,查INTEL太麻烦,请高手指点一下。万谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
对齐伪指令格式:

ALIGN  Num

其中:Num必须是2的幂,如:2、4、8和16等。

伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。

如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。
2007-6-13 13:23
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
好像有一点清晰了,请版主再看看这个M32LIB内的函数:

; #########################################################################

    .486
    .model flat, stdcall
    option casemap :none   ; case sensitive

    .code

; ########################################################################

szCmpi proc src:DWORD, dst:DWORD, ln:DWORD

  ; -----------------------------------------------------------
  ; algorithm compares any two byte sequences CASE INSENSITIVE
  ; and returns zero if they are identical or the character
  ; count where the two byte sequences mismatch.
  ; -----------------------------------------------------------

    push ebx
    push esi
    push edi

    jmp @F
    align 16
   
  table:
    db   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15
    db  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
    db  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47
    db  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
    db  64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95
    db  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
    db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
    db 144,145,146,147,148,149,150,151,152,153,154,155,156,156,158,159
    db 160,161,162,163,164,165,166,167,168,169,170,171,172,173,173,175
    db 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
    db 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207
    db 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
    db 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239
    db 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  @@:

    lea ebx, table      ; table base address
    mov esi, src        ; 1st string in ESI
    mov edi, dst        ; 2nd string in EDI
    mov ecx, ln         ; length in ECX
    add ecx, esi        ; add ESI to get exit condition

  @@:
    mov al, [esi]       ; get 1st byte
    inc esi
    xlatb               ; replace it with byte in table
    mov ah, al          ; store it in AH
    mov al, [edi]       ; get 2nd byte
    inc edi
    xlatb               ; replace it with byte in table
    cmp ah, al          ; compare if equal
    jne @F              ; jump out if not equal
    cmp esi, ecx        ; exit on length
    jl @B
  @@:

    sub esi, src

    .if esi == ln
      xor eax, eax
    .else
      mov eax, esi
    .endif

    pop edi
    pop esi
    pop ebx

    ret

szCmpi endp

; ########################################################################

    end

它在里面加了align 16,有什么好处呢?不加会怎么样?
2007-6-13 14:10
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
作用只是让table开始的地址可以被16整除的地址处开始存放,目的只是对齐地址,对齐的地址数据CPU读取起来比没用对齐的地址读取更节约CPU效率。
2007-6-13 14:39
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
多谢老大!再问一下老大: masm32缺省在32位的CPU下,是4字节对齐吗?如果自己没有设定。
2007-6-13 16:50
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
程序的开始的首地址肯定是对齐的,后面的就不一定了。
2007-6-13 17:13
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
OK! very thanks for all kind of u give me a hand. 结贴.
2007-6-13 17:46
0
游客
登录 | 注册 方可回帖
返回
//