日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

??? 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

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

這些偽指令不對(duì)局部變量產(chǎn)生影響, 因?yàn)閭沃噶钭饔迷诰幾g之前, 局部變量使用內(nèi)存是程序運(yùn)行之后的事.
關(guān)于局部變量的對(duì)齊和速度, 除了編譯的工作外, 我們?cè)诎才抛兞款愋秃痛涡驎r(shí)也應(yīng)該考慮到 "對(duì)齊" 的問題.

?

轉(zhuǎn)載于:----博客圓---------


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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。