2010年7月4日 星期日

[組語] 指標的使用方式 Ptr

指標的觀念我還蠻熟的~
在C語言中,對於使用指標相關的方式,有一定的了解~

但是,在組語中,對於指標的使用方式就還不是很了解~
剛好這個時候可以整理一下這一方面的資料~

在組語中,使用Ptr有一定的格式
資料長度 PTR [記憶體位址]
資料長度可以是BYTE, WORD, DWORD
例子:
MOV AL, BYTE PTR [0A02B000190008400h]

include Irvine32.inc
.data ; 以下開始為資料區段
x1 QWORD 0A02B000190008400h ; 在目前這一個位置存放一個QWORD的資料,內容為0A02B000190008400h
x2 QWORD 800187008000A904h ; 在目前這一個位置存放一個QWORD的資料,內容為800187008000A904h
sum BYTE 9 DUP(0) ; 所以申請9個Byte的記憶體空間
; sum是一個存放記憶體位址的變數

.code ; 程式碼區段
main PROC ; 宣告一個名為main的function
xor eAX,eAX ; 清除AX=0
mov eDI,0 ; 目的索引暫存器(EDX)亦清除
mov eCX,9 ; 累加暫存器(ECX)亦清除
CLC ; 清除進位旗標(CLear Carry flag)
L1:
jnc L2 ; 若CF=0則跳到 L2:
adc BYTE PTR [sum+eDI],0 ; 否則 sum[下一個Byte]=sum[下一個Byte]+1
CLC ; 清除進位旗標 CF=0
L2:
mov AL,BYTE PTR [x1+eDI] ; 把x1+eDI記憶體的位址開始,長度為BYTE的資料存放到AL的暫存器中
add AL,BYTE PTR [x2+eDI] ; 把x2+eDI記憶體的位址開始,長度為BYTE的資料存與AL做相加的動作
; 並且把結果放到AL中
add BYTE PTR [sum+eDI],AL ; 結果放到 sum
inc eDI ; 做下一個Byte
loop L1

; 傾印記憶體內容
mov eSI,offset sum ; 把sum位址傳給ESI
mov CX,9
call DumpMem ; 呼叫DumpMem函式
call DumpRegs ; 呼叫DumpRegs函式
exit
main ENDP ; 宣告的main函式的結束
END main


參考資料:
指令分類與指令集
組合語言的問題?
addr 與 offset

沒有留言: