程式一:
title add and subtract
; this program adds and subtracts 32-bit integers.
; last update: 06/01/2006
include irvine32.inc
.data
num dword 0ffffff9ch
.code
main proc
mov eax, num ; eax = 10000h
add eax,40000h ; eax = 50000h
sub eax,20000h ; eax = 30000h
call dumpregs
exit
main endp
end main
程式二 :
title add and subtract
; this program adds and subtracts 32-bit integers.
; last update: 06/01/2006
.386
.model flat,stdcall
.stack 4096
exitprocess proto, dwexitcode:dword ;宣告之後不需要使用include了
dumpregs proto ;宣告之後不需要使用include了
.data
num dword 0ffffff9ch
.code
main proc
mov eax, num ; eax = 10000h
add eax,40000h ; eax = 50000h
sub eax,20000h ; eax = 30000h
call dumpregs
invoke exitprocess, 0
main endp
end main
為什麼可以引用exitprocess 和 dumpregs呢,因為在vs2010中匯入了依賴庫路徑,和 依賴庫檔案(*.lib,kernel32.lib,irvine32.lib)。看到函式宣告(irvine32.inc中,或者是proto偽指令宣告)後,編譯器為該函式的呼叫留出乙個位置;在鏈結器工作的時候,尋找lib,尋找匯出函式名=該函式的lib,將預留的函式位址寫進去。
程式三:
title add and subtract
; this program adds and subtracts 32-bit integers.
; last update: 06/01/2006
.386
.model flat,stdcall
.stack 4096
exitprocess proto, dwexitcode:dword
dumpregs proto
.data
num dword 0ffffff9ch
snum byte 21 dup('a')
bnum dword 1,2,3,4,5,6,7
.code
main proc
mov ebx, 0
mov ebx, bnum+8
call dumpregs
invoke exitprocess, 0
main endp
end main
1:定義在.data中的資料在data區段內,並且連續,而且沒有4位元組對齊
2:mov ebx, bnum+8,這個8是位元組,so ebx=3
在xp中,記憶體中和pe檔案中是一樣的,但在windows 7下,由於alsr的關係,記憶體中的該指令的位址和檔案中就不一樣了。
組合語言 第三章
1.記憶體中字的儲存 2.ds暫存器 8086cpu自動取ds中的資料為記憶體單元的段位址,並且ds的值並不能直接賦給,要先將值賦給乙個一般暫存器進行中轉,在傳入ds中。3.mov,add,sub命令。mov 賦值。mov指令中只給出單元的偏移位址,段位址預設存在ds中。add 將後面的資料加到前面...
組合語言第三章總結
如何看待 記憶體 可以存放資料 資料段 自己定義的資料 可以存放指令 指令段 自己定義的指令 可以定義成棧空間 棧段 臨時存放資料 那麼如何讓 cpu 按照我們的意願去訪問記憶體?對於資料段,我們需要有段位址 偏移位址,目前段位址暫存器只學過 ds 暫存器,偏移位址只學過 0 1 進行訪問 對於指令...
C 語言程式設計 第三章
函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...