| 32 位的寄存器容量是 4 字節(jié), 如果內(nèi)存中的數(shù)據(jù)都按 4*n 字節(jié)對(duì)齊, 肯定會(huì)加快吞吐速度; 但事實(shí)并非如此, 不同大小的數(shù)據(jù)可能會(huì)讓寄存器別別扭扭地去處理, 從而降低了運(yùn)行速度! 如果使用對(duì)齊, 就會(huì)浪費(fèi)掉一些內(nèi)存空間; 其實(shí)這是一個(gè)需要權(quán)衡 "速度" 與 "內(nèi)存" 得失的問題. 準(zhǔn)備使用的測(cè)試文件: ------------------------------------------------------------------------------------------------------------------------------------------ .586 .modelflat, stdcall include?? windows.inc include?? kernel32.inc include?? masm32.inc include?? debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data ?? ;聲明三個(gè)字節(jié)變量 ??? v1 db 0 ??? v2 db 0 ??? v3 db 0 .code main proc ?? ;三個(gè)字節(jié)變量的默認(rèn)偏移地址如下(在沒有對(duì)齊約束的情況下, 它們各占一個(gè)字節(jié)): ??? PrintDec offset v1 ;4206592 ??? PrintDec offset v2 ;4206593 ??? PrintDec offset v3 ;4206594 ??? ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ALIGN: 指定對(duì)齊邊界 ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_2.asm .586 .modelflat, stdcall include?? windows.inc include?? kernel32.inc include?? masm32.inc include?? debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data ??? v1 db0 ??? align 4 ;讓下一個(gè)變量的起始地址保證是 4 的倍數(shù) ??? v2 db0 ??? v3 db0 .code main proc ??? PrintDec offset v1 ;4206592 ??? PrintDec offset v2 ;4206596 (!) ??? PrintDec offset v3 ;4206597 ??? ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ;align 后面的參數(shù)是 2n, 還可測(cè)試下: 1、2、8、16 EVEN 是偶對(duì)齊, 相當(dāng)于 ALIGN 2 ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_3.asm .586 .modelflat, stdcall include?? windows.inc include?? kernel32.inc include?? masm32.inc include?? debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data ??? v1 db0 ??? even?? ;(!) ??? v2 db0 ??? v3 db0 .code main proc ??? PrintDec offset v1 ;4206592 ??? PrintDec offset v2 ;4206594 (!) ??? PrintDec offset v3 ;4206595 ??? ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ORG 可以指定從當(dāng)前位置跨越指定書目的字節(jié)再安排下一個(gè)數(shù)據(jù): ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_4.asm .586 .modelflat, stdcall include?? windows.inc include?? kernel32.inc include?? masm32.inc include?? debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data ??? v1 db0 ??? org100 ;(!) ??? v2 db0 ??? v3 db0 .code main proc ??? PrintDec offset v1 ;4206592 ??? PrintDec offset v2 ;4206692 (!) ??? PrintDec offset v3 ;4206693 ??? ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ 這些偽指令不對(duì)局部變量產(chǎn)生影響, 因?yàn)閭沃噶钭饔迷诰幾g之前, 局部變量使用內(nèi)存是程序運(yùn)行之后的事. 關(guān)于局部變量的對(duì)齊和速度, 除了編譯的工作外, 我們?cè)诎才抛兞款愋秃痛涡驎r(shí)也應(yīng)該考慮到 "對(duì)齊" 的問題. ? 轉(zhuǎn)載于:----博客圓--------- |