組合語言資料傳送指令之堆疊操作指令

2021-09-03 07:40:17 字數 2232 閱讀 9494

處理器通常用硬體支援堆疊 (stack) 資料結構, 它是乙個按「先進後出" (first in lastout, filo) 訪問原則組織的儲存區域, 也可以說是 「後進先出" (last in first out, lifo) 訪問原則。 堆疊具有兩種基本操作, 對應兩條基本指令: 資料壓進堆疊操作對應進棧指令push; 資料彈出堆疊操作對應出棧指令 pop。

ia-32處理器的堆疊建立在主存區域中, 使用ss段暫存器指向段基位址。 堆疊段的範圍由堆疊指標暫存器 esp 的初值確定, 這個位置就是堆疊底部 (不再變化)。 堆疊只有乙個資料出人口, 即當前棧頂 (不斷變化), 由堆疊指標暫存器esp 的當前值指定棧頂的偏移位址, 隨著資料進人堆疊, esp逐漸減小; 而隨著資料依次彈出堆疊,esp逐漸增大。 隨著esp增大, 彈出的資料不再屬於當前堆疊區域, 隨後進入堆疊的資料也會占用這個儲存空間。 當然, 如果進人堆疊的資料超出了設定的堆疊範圍, 或者已無資料可以彈出 (即 esp增大到棧底), 就會產生堆疊溢位錯誤。 堆疊溢位, 輕者使程式出錯,重者會導致系統崩潰。

ia-32處理器的堆疊是「向下生長的」,也就是說隨著資料進棧,esp指標會逐漸減小

1、 進棧指標push

進棧指令push先將esp減小作為當前棧頂,然後可以將立即數,通用暫存器和段暫存器或儲存器運算元傳送到當前棧頂,由於目的位置是棧頂,所以由 esp確定push只表達源運算元。 格式是:

pushr16/m16/i16/seg:esp=esp-2,ss[esp]=r16/m16/i16/seg

push r32/m32/i32:esp=esp-4,ss:[esp]=r32/m32/i32

ia-32處理器的堆疊只能以字或雙字為單位操作. 字量效據進棧時, esp 向低位址移動兩個位元組單元指向當前棧頂,雙字資料進棧,esp減4即準備4個位元組資料以 「低對低, 高對高」 的小端方式存放到堆疊頂部

2、 出棧指令pop

出棧指令pop執行與進棧指令相反的功能, 它先將棧頂資料傳送到通用暫存器、 儲存單元或段暫存器中, 然後esp增加作為當前棧頂。 由於源運算元在棧頂, 且由 esp確定, 所以pop指令只表達目的運算元。格式是:

pop r16/m16/seg;d r16/m16/seg=ss:[esp],2esp=esp+2

pop r32/m32/r32/m32=ss:[esp],2)esp=esp+4

字量資料出棧時, esp 向高位址移動2個位元組單元 (即加2)。 雙字量資料出棧時, esp加4。 然後, 資料以 「低對低、 高對高」 原則從棧頂傳送到目的位置,

pop指令相當於一條傳送指令mov加上一條對esp的加法指令add

指令系統中還有一些針對特定需要設計的專用傳送指令。

位址傳送指令

儲存器運算元具有位址屬性, 利用位址傳送指令可以獲取其位址。 其中, 最常用的是獲取有效位址指令lea (load effective address), 格式如下:

lea r16/r32,mem ;r16/r32 =mem的有效位址ea(不需要型別一致)

lea指令將儲存器運算元的有效位址 (段內偏移位址)傳送至16位或32位通用器中它的作用等同於匯程式設計序 masm 的位址操作符offset。 但是,lea指令是在指令執行時計算出的偏移位址, 而offset 操作符是在彙編階段取得變數的偏移位址,(後者執行速度更快。 不過, 對於在彙編階段無法確定的偏移位址, 就只能利用lea指令獲取了。

ia-32 處理器指令系統還有指標傳送指令lds, les, lfs, lgs 和lss, 它們能將主存連續4個或6個位元組內容的前兩個依次傳送給ds, es,fs, gs和ss, 後續位元組作為偏移位址傳送給指令的16位或32位通用暫存器。 另外,mov指令還可以支援對控制暫存器等系統專用暫存器的資料傳送, 不過它們通常不能在應用程式中使用。

2.換碼指令

資料表是常見的資料結構, 程式設計中經常需要獲得資料表中的某個特定資料項, 處理器為此專門設計了換碼指令。 換碼指令xlat (translate) 是一條比較複雜的指令, 但格式卻非常簡單,

如下所示:

xlat;al

使用xlat指令前, 需要將ebx指向主存緩衝區 (即資料表首位址) 並給al賦值距離緩衝區開始的位移量 (即表中資料項的位置), 執行的功能是將緩衝區該位移量位置的資料取出給al, 可以表達為 「al

標誌傳送指令

ia-32處理器有可以直接改變cf, df、 if標誌狀態的標誌位操作指令, 還有針對標誌暫存器低8位,低16位和全部32位傳送的指令

組合語言 傳送指令

一.傳送指令 1.通用傳送指令mov mov dst,src 將src傳送到dst中 dstsrc操作位數 mem reg imm8 16 mem reg seg reg8 16 reg seg mem 8 16 mem reg seg 8 16 imm是立即數,reg是暫存器,seg是段暫存器,m...

(2)組合語言之資料傳送指令

c語言有不同的資料格式,如char,short,int,long等。組合語言針對不同資料有不同的操作碼形式,如movb 傳送位元組 movw 傳送字 movl 傳送雙字 本篇及後面幾篇文章皆採用32位的intel格式,如下圖所示 intel資料型別 彙編 字尾 大小 位元組 位元組b 1字w2 雙字...

組合語言 彙編指令

功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...