日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)

發(fā)布時間:2023/12/1 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?

32 位的寄存器容量是 4 字節(jié), 如果內存中的數據都按 4*n 字節(jié)對齊, 肯定會加快吞吐速度;
但事實并非如此, 不同大小的數據可能會讓寄存器別別扭扭地去處理, 從而降低了運行速度!

如果使用對齊, 就會浪費掉一些內存空間; 其實這是一個需要權衡 "速度" 與 "內存" 得失的問題.

準備使用的測試文件:

------------------------------------------------------------------------------------------------------------------------------------------
.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
?? ;聲明三個字節(jié)變量
??? v1 db 0
??? v2 db 0
??? v3 db 0
.code
main proc
?? ;三個字節(jié)變量的默認偏移地址如下(在沒有對齊約束的情況下, 它們各占一個字節(jié)):
??? PrintDec offset v1 ;4206592
??? PrintDec offset v2 ;4206593
??? PrintDec offset v3 ;4206594
??? ret
main
endp
end
main

------------------------------------------------------------------------------------------------------------------------------------------
ALIGN: 指定對齊邊界

------------------------------------------------------------------------------------------------------------------------------------------

; 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 ;讓下一個變量的起始地址保證是 4 的倍數
??? 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 后面的參數是 2n, 還可測試下: 1、2、8、16

EVEN 是偶對齊, 相當于 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 可以指定從當前位置跨越指定書目的字節(jié)再安排下一個數據:

------------------------------------------------------------------------------------------------------------------------------------------

; 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

??? org
100 ;(!)
??? v2 db0
??? v3 db0
.code
main proc
??? PrintDec offset v1 ;4206592
??? PrintDec offset v2 ;4206692 (!)
??? PrintDec offset v3 ;4206693
??? ret
main
endp
end
main

------------------------------------------------------------------------------------------------------------------------------------------

這些偽指令不對局部變量產生影響, 因為偽指令作用在編譯之前, 局部變量使用內存是程序運行之后的事.
關于局部變量的對齊和速度, 除了編譯的工作外, 我們在安排變量類型和次序時也應該考慮到 "對齊" 的問題.

?

轉載于:----博客圓---------


創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。