国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【匯編語言】棧區(qū)與SS:SP寄存器

這篇具有很好參考價值的文章主要介紹了【匯編語言】棧區(qū)與SS:SP寄存器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

匯編語言 - 棧

棧是一塊特殊的內(nèi)存空間,本文涉及的CPU為8086CPU,所有與內(nèi)存地址有關的數(shù)字皆為16進制

前言

棧的運行規(guī)律 - 先進后出,后進先出

以下為入棧的過程:
【匯編語言】棧區(qū)與SS:SP寄存器

以下是出棧的過程:

【匯編語言】棧區(qū)與SS:SP寄存器

以上就是棧的運行機制,棧的入棧叫做push,出棧叫做pop

在8086CPU中,棧是一塊特殊的內(nèi)存空間,棧的出棧和入棧都是以字為單位的

1. 8086棧機制

8086使用一段內(nèi)存對棧進行模擬,最基本的操作是pop(出棧)和push(入棧)

  • pop 寄存器 : 表示將棧頂元素出棧并且將數(shù)據(jù)送入寄存器中
  • push 寄存器: 表示將寄存器中的元素入棧

下面是一段當作棧區(qū)使用的內(nèi)存空間,初始化如下:

執(zhí)行指令:push AX后:

寄存器AX中的內(nèi)容被存放進內(nèi)存中,棧頂指針上移兩個字節(jié)

執(zhí)行指令 push BX 后:

寄存器BX中的內(nèi)容被存放進內(nèi)存中,棧頂指針上移兩個字節(jié)

執(zhí)行指令pop CX中:

將棧頂元素送入CX后,棧頂指針下移兩個字節(jié)

我們只需要使用pop和push指令,就可以對這段內(nèi)存空間按照先進先出的規(guī)則進行訪問,那么CPU怎么知道這段空間就是棧空間呢?

2. SS和SP寄存器

CPU是怎么知道我們執(zhí)行的指令的地址?CPU是怎么知道我們執(zhí)行指令的時候需要的數(shù)據(jù)的地址的?CPU通過CS:IP寄存器確定指令的位置,CPU通過DS:[address]確認數(shù)據(jù)的位置,那么需要確定棧頂?shù)奈恢?,也需要添加寄存器,SS與SP寄存器就是用來確定棧頂?shù)奈恢玫摹?/p>

SS寄存器中存著棧頂?shù)亩蔚刂?,SP寄存器中存放著偏移地址,通過這兩個寄存器中的值就可以判斷棧頂?shù)奈恢谩?/p>

2.1 push指令與pop指令

push指令的完成,需要以下兩個步驟

  1. SP = SP - 2:因為SS:SP指向前棧頂,既然需要push 數(shù)據(jù),自然需要獲取新棧頂
  2. 將 push 后面跟的寄存器中的內(nèi)容寫入剛開辟出的內(nèi)存中,此時的SS:SP指向新棧頂

入棧時,棧頂從高地址向低地址增長

pop指令的完成,需要以下兩個步驟

  1. 將棧頂元素送入pop后面跟的寄存器中
  2. SP = SP + 2,SS:SP指向下一個元素

出棧時,棧頂從低地址向高地址增長

2.2 示例

測試初始空間如下:

圖中的棧頂SS:IP應為 SS:SP

當前SS:SP指向1000:A

執(zhí)行push AX 指令后:

棧頂指針先上移,SP = SP - 2,然后將AX中的數(shù)據(jù)寫入棧頂

【匯編語言】棧區(qū)與SS:SP寄存器

執(zhí)行push BX指令后:

棧頂指針先上移,SP = SP - 2,然后將BX中的數(shù)據(jù)寫入棧頂

【匯編語言】棧區(qū)與SS:SP寄存器

執(zhí)行pop AX指令后:

先將棧頂中的數(shù)據(jù)寫入AX中,然后棧頂指針下移,SP=SP + 2

執(zhí)行pop BX指令后:
先將棧頂?shù)臄?shù)據(jù)寫入BX中,然后棧頂指針下移,SP = SP + 2

如果1000:0 到 1000:F 這塊內(nèi)存是棧空間,并且初始狀態(tài)???,那么初始狀態(tài)下棧頂指針應指向1001:0,也就是第一次PUSH時棧頂指針剛好能夠減到1000:E

2.3 越界問題

因為8086CPU只提供了棧頂寄存器,如果劃分了一段內(nèi)存空間為棧空間,例如1000:0 到 1000:F,如果SS:SP指針通過一系列的push和pop操作超出了這個范圍,出現(xiàn)了上溢或者下溢的問題,是沒有辦法解決的,因為8086CPU 并沒有提供對應的寄存器存放??臻g的大小,不能在每次push和pop操作之前先判斷是否越界。

只能通過自己編程的時候避免。

3. debug測試

3.1 例題

利用棧的功能交換兩個寄存器中的內(nèi)容

寄存器和內(nèi)存初始化

將AX壓棧:

將BX壓棧:

將棧頂pop到AX中:

將棧頂pop到BX中

完成兩個寄存器中的內(nèi)容交換

3.2 在debug中進行測試

  1. 先將AX和BX中的內(nèi)容設置為1234H和5678H,然后找好棧區(qū)
  1. 寫入對應的代碼
  1. 將CS:IP指向?qū)拇a處,則開始運行程序

執(zhí)行完代碼后成功交換寄存器中的值文章來源地址http://www.zghlxwxcb.cn/news/detail-400496.html

到了這里,關于【匯編語言】棧區(qū)與SS:SP寄存器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【ARM裸機編程 | 海思SS528】- 操作 GPIO 寄存器輸出低電平點亮 LED 燈

    【ARM裸機編程 | 海思SS528】- 操作 GPIO 寄存器輸出低電平點亮 LED 燈

    這篇文章主要介紹在 海思SS528 開發(fā)板,去操作某個 GPIO 寄存器輸出高、低電平,來熄滅或點亮 LED 燈。 首先,了解一下 ARM裸機編程 ,也就是在一塊沒有移植操作系統(tǒng)的ARM開發(fā)板去編程,相當于把它當成單片機去使用,很多與硬件相關的操作都需要直接讀寫該硬件的寄存器。

    2024年02月10日
    瀏覽(22)
  • Arm匯編---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 條件碼:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、數(shù)據(jù)寄存器 --------------------------------------------- ------------------------------------------ 二、指針寄存器 --------------------------------------------- --------------------

    2024年02月02日
    瀏覽(23)
  • 【匯編中的寄存器分類與不同寄存器的用途】

    寄存器分類 在計算機體系結構中,8086CPU,寄存器可以分為以下幾類: 1. 通用寄存器: 通用寄存器是用于存儲數(shù)據(jù)和執(zhí)行算術運算的寄存器。在 x86 架構中,這些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分別作為累加器(accumulat

    2024年02月09日
    瀏覽(23)
  • 16位匯編通用寄存器

    16位匯編通用寄存器

    1、輸入命名debug,進入調(diào)試程序 2、r 命令顯示寄存器 3、a命令輸入?yún)R編指令 4、t命令單步執(zhí)行匯編指令 5.數(shù)據(jù)溢出后標志位NC 變?yōu)镹Y, 0變成1 最后A

    2023年04月11日
    瀏覽(37)
  • 通用寄存器-匯編復習(1)

    通用寄存器-匯編復習(1)

    弄清寄存器表達,原理和配件及匯編實驗驗證。 8086cpu寄存器,字在寄存器存儲 往期文章: 匯編語言基礎-匯編復習(0)_luozhonghua2000的博客-CSDN博客 一個典型的 CPU(此處討論的不是某一具體的 CPU)由運算器、控制器、寄存器(CPU工作原理)等器件構成,這些器件靠內(nèi)部總線相連。前

    2024年02月07日
    瀏覽(22)
  • 一、1.匯編指令、寄存器和尋址方式

    一、1.匯編指令、寄存器和尋址方式

    立即數(shù):可以立即在一條機器指令后找到具體數(shù)值的數(shù),如內(nèi)存中00位寫著加指令,01位寫著1100_1111,意思就是將1100_1111(十進制207)加到某處,反之可以表示數(shù)據(jù)的地址。 低端字節(jié)序:16位寄存器數(shù)據(jù)存入內(nèi)存(內(nèi)存單位為8位),寄存器低位存入內(nèi)存低位(如00)高位存入內(nèi)

    2024年02月14日
    瀏覽(27)
  • ARM64 寄存器、常用匯編指令收集

    ARM64 有34個寄存器,包括31個通用寄存器、SP、PC、CPSR。 寄存器 位數(shù) 描述 x0-x30 64bit 通用寄存器,如果有需要可以當做32bit使用:WO-W30 FP(x29) 64bit 保存棧幀地址(棧底指針) LR(x30) 64bit 通常稱X30為程序鏈接寄存器,保存子程序結束后需要執(zhí)行的下一條指令 SP 64bit 保存棧指針,使用

    2023年04月20日
    瀏覽(31)
  • ARM匯編寄存器和常用指令詳解

    ARM匯編寄存器和常用指令詳解

    對于32位及其以下的ARM處理器來說,函數(shù)調(diào)用規(guī)則如下: 父函數(shù)與子函數(shù)的入口參數(shù)以此通過 R0~R3 這4個寄存器傳遞。 父函數(shù)在調(diào)用子函數(shù)前先將子函數(shù)入口參數(shù)存入 R0~R3 寄存器中,若只有一個入口參數(shù)則使用 R0 寄存器傳遞,若有2個入口參數(shù)則使用 R0 和 R1 寄存器傳遞,以

    2024年02月03日
    瀏覽(30)
  • 匯編語言筆記(一)——匯編語言基礎

    匯編語言筆記(一)——匯編語言基礎

    一、開發(fā)環(huán)境 我使用visual studio 2022 preview,其他版本的設置大同小異。 第一步: 打開visual studio,點擊“創(chuàng)建新項目”: 第二步: visual studio并沒有專門的匯編項目,所以需要掛羊頭賣狗肉,選擇C++空項目 第三步: 輸入項目名稱,點擊創(chuàng)建 第四步: 鼠標右鍵單擊項目名稱—

    2024年02月05日
    瀏覽(23)
  • [ARM 匯編]高級部分—系統(tǒng)控制協(xié)處理器—3.2.3 控制寄存器的讀寫操作

    [ARM 匯編]高級部分—系統(tǒng)控制協(xié)處理器—3.2.3 控制寄存器的讀寫操作

    在這一部分,我們將學習如何使用ARM匯編指令在系統(tǒng)控制協(xié)處理器(CP15)的控制寄存器上執(zhí)行讀寫操作。我們將通過實例來講解如何使用MCR(Move to Coprocessor Register)和MRC(Move from Coprocessor Register)指令進行讀寫操作。 MCR指令 MCR指令用于將ARM內(nèi)核寄存器的值寫入?yún)f(xié)處理器寄存

    2024年02月11日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包