標籤

2009年6月10日 星期三

assembly 語法筆記

lods
從DS:SI所指向的空間中 取出一個byte/word/dword 放入 AL/AX/EAX 同時把SI+(-)1/2/4

lods相當於

mov AL, BYTE PTR ds:[si]
inc si


lods DWORD PTR es:[esi]相當於

mov eax, DWORD PTR es:[esi]
add esi, 4


align PTR
http://evotalk.net/blog/?p=116
OFFSET : 傳回變數從所在區段開始的偏移距離

.data
bVal BYTE ?
wVal WORD ?
dVal DWORD ?
dVal2 DWORD ?
.code ; assume bVal's offset : 00404000
mov esi , OFFSET bVal ; ESI = 00404000
mov esi , OFFSET wVal ; ESI = 00404001
mov esi , OFFSET dVal ; ESI = 00404003
mov esi , OFFSET dVal2 ; ESI = 00404007


ALIGN : 將變數置於位元組、字組、雙字組或是段落的邊界
ALIGN 邊界
邊界 = 1 : 下一變數位址會置於一個位元組的邊界(預設)
邊界 = 2 : 下一變數位址會置於一個雙數的位址的邊界
邊界 = 4 : 下一變數位址會置於一個四的倍數位址的邊界

bval BYTE ? ; 00404000
ALIGN 2
wVal DWORD ? ; 00404002
bVal2 BYTE ? ; 00404004
ALIGN 4
dVal DWORD ? ; 原本是00404005,現為00404008
dVal2 DWORD ? ; 0040400C


PTR : 存取的變數大小與當初宣告的變數不同

.data
myDouble DWORD 12345678h
.code mov ax , myDouble ; error
mov ax , WORD PTR myDouble ; ax = 5678h
mov ax , WORD PTR [myDouble + 2] ; ax = 1234h
mov bl , BYTE PTR myDouble ; bl = 78h


TYPE : 傳回變數單一元件以 byte為單位的大小值

.data
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
var4 QWORD ?
TYPE var1 ; 1
TYPE var2 ; 2
TYPE var3 : 4
TYPE var4 ; 8


LENGTHOF : 計算陣列中的元件數

.data
byte1 BYTE 10,20,30
array1 WORD 30 DUP(?) , 0,0
array2 WORD 5 DUP( 3 DUP(?) )
array3 DWORD 1 ,2 ,3, 4
digitStr BYTE "12345678" , 0
LENGTHOF byte1 ; 3
LENGTHOF array1 ; 30+2
LENGTHOF array2 ; 5*3
LENGTHOF array3 ; 4
LENGTHOF digitStr ; 9
myArray BYTE 10,20,30,40,50
BYTE 60,70,80,90,100
LENGTHOF myArray ;只計算第一列定義的部分陣列,傳回 5


SIZEOF : 傳回的值等於LENGTHOF乘上TYPE的值

intArray WORD 32 DUP(0) ; SIZEOF = 32 * 2

沒有留言: