彙編基礎學習11

2021-05-02 03:13:01 字數 1302 閱讀 9469

文章** 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是什麼意思。如果學過程式的人都應該知道這個就是...