文章** http://www.mcany.cn/article/286.htm
博主 沒落的殘陽
這節來學習下loop迴圈指令。我們高階語言的堆疊分配初始化可是靠它了呵呵。 首先我們來看下它的指令格式。。
loop 標號 ;ecx不為零時跳轉至標號迴圈.標號只是寫匯程式設計序時用來表示乙個記憶體位址的。
例如 token:
xor eax, eax
此時token等於 xor eax, eax指令的記憶體位址 。標號格式:「 標號名稱: 」。
從它的指令格式中,我們就可以看出來,它是靠判斷ecx暫存器是為0來決定是否往下迴圈的。那麼我們可以由此聯想到,每次迴圈之前我們要對ecx進行賦值,也就是賦上迴圈次數。。
舉例 mov ecx, 3h ;迴圈次數
_loop:;標號,它在彙編中是用來標示記憶體位址。此時_loop = mov eax, 00304020h的記憶體位址。它的格式是 標號名:
mov eax, 00304020h ;迴圈內容
add eax, eax ;迴圈內容
loop _loop
這裡我們來分析下這個迴圈過程。
1. 首先程式執行
mov ecx, 3
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ;執行到這裡ecx-1=2,然後cpu判斷ecx暫存器是否為0,如果是的話結束迴圈往下執行,如果不是則跳轉到標號處繼續執行。。
2 第二次執行
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ; ecx -1 = 1
;執行到這裡ecx-1=1,然後cpu判斷ecx暫存器是否為0,如果是的話結束迴圈往下執行,如果不是則跳轉到標號處繼續執行。。
3 第三次執行
mov eax, 00304020h ;eax = 00304020h
add eax, eax ; eax = eax+eax
loop _loop ; ecx -1 = 0
;執行到這裡ecx - 1 =0, cpu判斷ecx已經是0了,就不接著跳轉標號繼續迴圈了,則設定設定eip為下一條指令的偏移,繼續開始執行。。
其實也很簡單。。 loop是靠判斷ecx暫存器為依據來進行迴圈的。 loop指令後面跟的是乙個記憶體位址。也就是要進行起始迴圈指令的位址。 如果ecx不為0,則跳轉到起始迴圈指令的位址開始執行。
彙編學習筆記11
第11講講了剩下兩個減法指令 neg 和 cmp neg op 對op進行求補,然後將結果送入op,運算元可以是通用暫存器和儲存單元。當op為8位 128或16位 32768時,結果為它自身。當op為0時,cf位為0,其他時候都為1。neg操作其實是 op 0 op。cmp op1,op2 比較操作...
彙編基礎學習5
文章 http www.mcany.cn article 280.htm 博主 沒落的殘陽 今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。用高階語言的...
彙編基礎學習7
博主 沒落的殘陽 這節來講解一下棧的延伸,堆疊 算是把昨天的整個理論基礎概念,給大家講解下。執行時棧 runtime stack 我們通常稱為 堆疊 這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是...