青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

luqingfei@C++

為中華之崛起而崛起!
兼聽則明,偏聽則暗。

匯編語言--寄存器(內存訪問)

知識點:內存中字的存儲、DS和[address]、字的傳送、mov,add,sub指令、數據段、棧、CPU提供的棧機制、棧頂超界的問題、push,pop指令、棧段。

內存中字的存儲
CPU中,用16位寄存器來存儲一個字。高8位存放高位字節,低8位存放低位字節。
在內存中存儲時,由于內存單元是字節單元(一個單元存放一個字節),則一個字要用兩個地址連接的內存單元來存放,這個字的低位字節放在低地址單元中,高位字節存放在高地址單元中。

字單元:即存放一個字型數據(16位)的內存單元,由兩個地址連續的內存單元組成。高地址內存單元中存放字型數據的高位字節,低地址內存單元中存放字型數據的低位字節。

任何兩個地址連續的內存單元,N號單元和N+1號單元,可以將它們看成兩個內存單元,也可看成一個地址為N的字單元中的高位字節單元和低位字節單元。


DS和[address]
CPU要讀寫一個內存單元的時候,必須先給出這個內存單元的地址,在8086CPU中,內存地址由段地址和偏移地址組成。
8086CPU中有一個DS寄存器,通常用來存放要訪問數據的段地址。

mov指令,可完成三種傳送:
(1)將數據直接送入寄存器;
          mov 寄存器名,數據
(2)將一個寄存器中的內容送入另一個寄存器;
          mov 寄存器名,寄存器名
(3)將一個內存單元中的內容送入一個寄存器中。
          mov 寄存器,[內存單元的偏移地址]

“[...]”表示一個內存單元的偏移地址,我們知道,只有偏移地址是不能定位一個內存單元的,那么內存單元的段地址是多少呢?
指令執行時,8086CPU自動取ds中的數據為內存單元的段地址。

所以,我們需要根據情況,改變ds中的數據。
比如 mov ds, 1000H
但是,8086CPU不支持將數據直接送入段寄存器的操作,ds是一個段寄存器,所以mov ds, 1000H這條指令是非法的

那么如何將1000H送入ds呢?只好用一個寄存器來進行中轉,即先將1000H送入一個一般的寄存器,如bx,再將bx中的內容送入ds。


怎樣將數據從寄存器送入內存單元?
從內存單元到寄存器的格式是:mov 寄存器名,內存單元地址
從寄存器到內存單元則是:mov 內存單元地址,寄存器名。

將al中的數據送入內存單元10000H。
10000H可表示為1000:0,用ds存放段地址1000H,偏移地址是0,則:mov [0], al可完成從al到10000H的數據傳送。
mov bx, 1000H
mov ds, bx
mov [0], al


字的傳送
mov指令在寄存器和內存之間進行字節型數據的傳送。
因為8086CPU是16位結構,有16根數據線,所以,可以一次性傳送16位的數據,也就是說可以一次性傳送一個字。

我們只要在mov指令中給出16位的寄存器就可以進行16位數據的傳送了。


mov, add, sub指令
mov指令目前可以有以下幾種形式:
mov 寄存器,數據               mov ax,8
mov 寄存器,寄存器           mov ax,bx
mov 寄存器,內存單元       mov ax,[0]
mov 內存單元,寄存器       mov [0],ax
mov 段寄存器,寄存器       mov ds,ax

add和sub指令同mov一樣,都有兩個操作對象,它們也可以有上面的幾種形式。
這些形式中有些,兩個操作數可以相互交換操作,這些需要用debug中的a命令和t命令多實踐實踐。


數據段
前面講過,對于8086CPU,在編程時,我們可以根據需要,將一組內在單元定義為一個段。
我們可以將一組長度為N(N≤64K)、地址連續、起始地址為16的倍數的內存單元當作專門存儲數據的內存空間,從而定義了一個數據段。
比如我們用:123B0H~123BAH這段內存空間來存放數據,我們就可以認為,123B0H~123BAH這段內存是一個數據段,它的段地址為123B,長度為10字節。

如何訪問數據段中的數據呢?
將一段內存當作數據段,是我們在編程時的一種安排,我們可以在具體操作的時候,用ds存放數據段的段地址,再根據需要,用相關指令訪問數據段中的具體單元。

比如,我們將123B0H~123BAH的內存單元定義為數據段。
我們現在要累加這個數據段中的前3個單元中的數據。
mov ax, 123BH
mov ds, ax                ;將123BH送入ds中,作為數據段的段地址。
mov al, 0                   ;用al存放累加結果,先把它清零。
add al, [0]                 ;將數據段第一個單元(偏移地址為0)中的數值加到al中。
add al, [1]                 ;將數據段第一個單元(偏移地址為1)中的數值加到al中。
add al, [2]                 ;將數據段第一個單元(偏移地址為2)中的數值加到al中。

累加數據段中的前3個字型數據。
mov ax, 123BH
mov ds, ax                ;將123BH送入ds中,作為數據段的段地址。
mov ax, 0                   ;用ax存放累加結果,先把它清零。
add al, [0]                 ;將數據段第一個字(偏移地址為0)加到ax中。
add al, [2]                 ;將數據段第一個字(偏移地址為2)加到ax中。
add al, [4]                 ;將數據段第一個字(偏移地址為4)加到ax中。


小結
(1)字在內存中存儲時,要用兩個地址連續的內存單元來存放,字的低位字節存放在低地址單元中,高位字節存放在高地址單元中。
(2)用mov指令要訪問內存單元,可以在mov指令中只給出單元的偏移地址。此時,段地址默認在DS寄存器中。
(3)[address]表示一個偏移地址為address的內存單元。
(4)在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。
(5)mov, add, sub是具有兩個操作對象的指令,jmp是具有一個操作對象的指令。
(6)可以根據自己的推測,在Debug中實驗指令的新格式。



在這里,我們對棧的研究僅限于這個角度:棧是一種具有特殊的訪問方式的存儲空間。
它的特殊性就在于,最后進入這個空間的數據,最先出去。

棧有兩個基本的操作:入棧和出棧。
入棧就是將一個新的元素到棧頂,出棧就是從棧頂取出一個元素。
棧頂的元素總是最后入棧,需要出棧和時,又最先被從棧中取出。
棧的這種操作規則被稱為:LIFO(Last In First Out, 后進先出)。


CPU提供的棧機制
現今的CPU中都有棧的設計,8086CPU也不例外。
8086CPU提供相關的指令來以棧的方式訪問內存空間。
這意味著,我們在基于8086CPU編程的時候,可以將一段內存當作棧來使用。

8086CPU提供入棧和出棧指令,最基本的兩個是PUSH(入棧)和POP(出棧)。
比如:push ax 表示將寄存器ax中的數據據送入棧中,pop ax表示從棧頂取出數據送入ax。
8086CPU的入棧和出棧操作都是以字為單位進行的。

注意,字型數據用兩個內存存儲單元存放,高地址單元放高8位,低地址單元放低8位。

8086CPU中,有兩個寄存器,段寄存器SS和寄存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。

任意時刻,SS:SP指向棧頂元素。push指令和pop指令執行時,CPU從SS和SP中得到棧頂的地址。

push ax的執行:
1)SP=SP-2, SS:SP指向當前棧頂前面的單元,以當前棧頂前面的單元為新的棧頂;
2)將ax中的內容送入SS:SP指向的內存單元處,SS:SP此時指向新棧頂。

pop ax的執行過程和push ax剛好相反:
1)將SS:SP指向的內存單元處的數據送入ax中;
2)SP=SP+2,SS:SP指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。

棧頂超界的問題
8086CPU用SS和SP指示棧頂的地址,并提供push和pop指令實現入棧和出棧。

但是,SS和SP只是記錄了棧頂的地址,依靠SS和SP可以保證在入棧和出棧時找到棧頂,可是,如何能夠保證在入棧、出棧時,棧頂不會超出棧空間?

當棧滿的時候再使用push指令入棧,或棧空的時候再使用pop指令出棧,都將發生棧頂超界問題。

棧頂超界是危險的,因為我們既然將一段空間安排為棧,那么在棧空間之外的空間里很可能存放了具有其他用途的數據、代碼等,這些數據、代碼可能是我們自己程序的,也可能是別的程序中的(畢竟一個計算機系統中并不是只有我們自己的程序在運行)。但是由于我們在入棧出棧時的不小心,而將這些數據、代碼意外地改寫,將會引發一連串的錯誤。

8086CPU不保證我們對棧的操作不會超界。
也就是說,8086CPU只知道棧頂在何處(由SS:SP指示),而不知道讀者安排的棧空間有多大。

我們在編程的時候要自己操心棧頂超界的問題,要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;執行出棧操作的時候也要注意,以防棧空的時候繼續出棧而導致的超界。


push、pop指令
push和pop指令是可以在寄存器和內存(棧空間當然也是內存空間的一部分,它只是一段可以以一種特殊的方式進行訪問的內存空間。)之間傳送數據的。

push和pop指令的格式可以是如下形式:
push 寄存器    ;將一個寄存器中的數據入棧
pop 寄存器     ;出棧,用一個寄存器接收出棧的數據

push 段寄存器  ;將一個段寄存器中的數據入棧
pop 段寄存器 ;出棧,用一個段寄存器接收出棧的數據

push和pop也可以在內存單元和內存單元之間傳送數據
push 內存單元 ;將一個內存單元處的字入棧(注意,棧操作都是以字為單位)
pop 內存單元   ;出棧,用一個內存單元接收出棧的數據
指令執行時,CPU要知道內存單元的地址,可以在push、pop指令只給出內存單元的偏移地址,段地址在執行指令時,CPU從ds中取得。


棧的綜述

1)8086CPU提供了棧操作機制,方案如下:
      在SS、SP中存放棧頂的段地址和偏移地址;
      提供入棧和出棧指令,它們根據SS:SP指示的地址,按照棧的方式訪問內存單元。
2)push指令的執行步驟:a、SP=SP-2;b、向SS:SP指向的字單元中送入數據。
3)pop指令的執行步驟:a、從SS:SP指向的字單元中讀取數據;b、SP=SP+2。
4)任意時刻,SS:SP指向棧頂元素。
5)8086CPU只記錄棧頂,棧空間的大小我們要自己管理。
6)用棧來暫存以后需要恢復的寄存器的內容時,寄存器出棧的順序和入棧的順序相反。
7)push、pop實質上是一種內存傳送指令,注意它們的靈活應用。

棧是一種非常重要的機制,一定要深入理解,靈活掌握。


棧段
前面講過,對于8086CPU,在編程時,我們可以根據需要,將一組內存單元定義為一個段。我們可以將長度為N(N<=64K)的一組地址連接、起始地址為16的倍數的內存單元,當作棧空間來用,從而定義了一個棧段。
比如,我們將10010H~1001FH這段長度為16字節的內存空間當作棧來用,以棧的方式進行訪問。這段空間就可以稱為一個棧段,段地址為1000H,大小為16字節。

將一段內存當作棧段,僅僅是我們在編程時的一種安排,CPU并不會由于這種安排,就在執行push、pop等棧操作指令時就自動地將我們定義的棧段當作棧空間來訪問。
如何使得如push、pop等棧操作指令訪問我們定義的棧段呢?就是要將SS:SP指向我們定義的棧段。

任意時刻,SS:SP指向棧頂元素,當棧為空的時候,棧中沒有元素,也就不存在棧頂元素,所以SS:SP只能指向棧的最底部單元下面的單元,該單元的地址為棧最底部的字單元的地址+2。
如果將10000H~1FFFFH這段空間當作棧段,棧最底部字單元的地址為1000:FFFE,所以棧空時,SP=0000H。

一個棧段最大可以設為多少?
從棧操作指令所完成的功能的角度上來看,push、pop等指令在執行的時候只修改SP,所以棧頂的變化范圍是0~FFFFH,人棧空時候的SP=0,一直壓棧,直到棧滿時SP=0;如果再次壓棧,棧頂將循環,覆蓋了原來棧中的內容。所以一個棧段的容量最大為64KB。


段的綜述
我們可以將一段內存定義為一個段,用一個段地址指示段,用偏移地址訪問段內的單元。這完全是我們自己的安排。
我們可以用一個段豐放數據,將它定義為“數據段”;
我們可以用一個段存放代碼,將它定義為“代碼段”;
我們可以用一個段當作棧,將它定義為“棧段”;
我們可以這樣安排,但若要讓CPU按照我們的安排來訪問這些段,就要:
對于數據段,將它的段地址放在DS中,用mov、add、sub等訪問內存單元的指令時,CPU就將我們定義的數據段中的內容當作數據來訪問;
對于代碼段,將它的段地址放在CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執行我們定義的代碼段中的指令;
對于棧段,將它的段地址放在SS中,將棧頂單元的偏移地址放在SP中,這樣CPU在需要進行棧操作的時候,比如執行push、pop指令等,就將我們定義的棧段當作棧空間來用。

可見,不管我們如何安排,CPU將的某段內容當作代碼,是為因為CS:IP指向了那里;CPU將某段內存當作棧,是為因SS:SP指向了那里。
我們一定要清楚,什么是我們的安排,以及如何讓CPU按我們的安排行事。要非常地清楚CPU的工作機理,才能在控制CPU來按照我們的安排運行的時候做到游刃有余。
比如我們將10000H~1001FH安排為代碼段,并在這里存儲如下代碼:
mov ax,1000H
mov ss,ax
mov sp,0020H     ;初始化棧頂
mov ax,cs
mov ds,ax           ;設置數據段段地址
mov ax,[0]
mov ax,[2]
mov bx,[4]
mov bx,[6]
push ax
push bx
pop bx
pop ax

設置CS=1000H,IP=0,這段代碼將得到執行,可以看到,在這段代碼中,我們雙將10000H~1001FH安排為棧段和數據段,10000H~1001FH這段內存,即是代碼段,又是棧段和數據段。

一段內存,可騍既是代碼的存儲空間,又是數據的存儲空間,還可以是棧空間,也可以什么也不是。
關鍵在于CPU中寄存器的設置,即:CS、IP、SS、SP、DS的指向。


posted on 2010-07-18 14:51 luqingfei 閱讀(4037) 評論(0)  編輯 收藏 引用 所屬分類: 匯編語言基礎學習

導航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

統計

留言簿(6)

隨筆分類(109)

隨筆檔案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国模一区二区三区| 国产精品一区二区女厕厕| 久久国产主播| 欧美激情亚洲自拍| 欧美成人免费在线| 国产精品人成在线观看免费| 国外精品视频| 亚洲影音一区| 亚洲激情在线| 亚洲视频久久| 美女免费视频一区| 国产亚洲欧美色| 亚洲香蕉伊综合在人在线视看| 久久久噜噜噜久久狠狠50岁| 亚洲精品一区在线观看香蕉| 日韩视频在线你懂得| 久久久免费av| 国产一区99| 小处雏高清一区二区三区| 亚洲精品裸体| 在线中文字幕一区| 欧美精品福利视频| 亚洲精品国产欧美| 欧美电影打屁股sp| 久久久久欧美精品| 国产精品h在线观看| 亚洲美女在线看| 国产欧美一区二区三区久久人妖 | 亚洲电影在线看| 亚洲已满18点击进入久久| 老牛影视一区二区三区| 欧美一区二区视频在线| 国产精品你懂的| 亚洲综合二区| 亚洲午夜视频在线| 国产精品久久影院| 国产中文一区二区| 久久久久久噜噜噜久久久精品| 亚洲调教视频在线观看| 国产精品久久久久久福利一牛影视| 国内成人精品一区| 久久影视三级福利片| 久久国产精品网站| 在线观看欧美精品| 欧美不卡高清| 欧美激情精品久久久久久久变态| 亚洲高清免费在线| 亚洲国产精品成人一区二区| 欧美激情精品| 亚洲国产精品尤物yw在线观看| 免费不卡中文字幕视频| 久久久噜噜噜久久中文字免| 亚洲国产欧美另类丝袜| 91久久久亚洲精品| 国产精品卡一卡二| 久久久91精品| 欧美成人免费在线观看| 亚洲视频专区在线| 性欧美大战久久久久久久免费观看| 国产婷婷精品| 亚洲第一区在线观看| 欧美日韩国产电影| 欧美诱惑福利视频| 久久国产精品亚洲va麻豆| 亚洲激情在线观看| 欧美成人一区二区| 欧美日韩1区2区| 久久激五月天综合精品| 免费视频亚洲| 亚洲欧美日韩一区| 老色鬼精品视频在线观看播放| 99成人在线| 久久国产直播| 亚洲综合欧美日韩| 免费中文日韩| 欧美在线不卡| 欧美日本高清一区| 久久色在线播放| 欧美日韩调教| 欧美不卡福利| 国产麻豆精品theporn| 老司机久久99久久精品播放免费| 国产精品高潮久久| 亚洲最新合集| 亚洲无线一线二线三线区别av| 你懂的国产精品永久在线| 美国成人毛片| 免费观看日韩| 亚洲天天影视| 免费成人高清视频| 猫咪成人在线观看| 一区二区在线观看视频在线观看| 香蕉久久夜色精品| 久久精品人人做人人爽电影蜜月| 国产欧美日韩亚洲精品| 亚洲欧美在线看| 久久精品女人的天堂av| 国模叶桐国产精品一区| 久久激情中文| 欧美成人午夜视频| 日韩小视频在线观看| 欧美精品偷拍| 亚洲乱码国产乱码精品精天堂| 日韩视频不卡中文| 欧美区在线播放| 在线一区亚洲| 久久精品30| 亚洲电影免费| 欧美精品尤物在线| 亚洲午夜一区二区| 久久免费视频观看| 亚洲欧洲精品一区| 欧美日韩午夜在线| 亚洲一区一卡| 老司机aⅴ在线精品导航| 亚洲国产精品电影| 欧美日韩一二三区| 性做久久久久久久免费看| 麻豆成人综合网| 一本久久综合亚洲鲁鲁五月天| 欧美三区美女| 久久久不卡网国产精品一区| 亚洲第一福利社区| 亚洲专区一二三| 精品成人在线| 欧美视频一区二区在线观看| 欧美在线视频观看| 亚洲黄色片网站| 欧美一区二区日韩| 亚洲激情小视频| 国产精品制服诱惑| 欧美国产日韩视频| 午夜精品久久久久久久久久久久 | 亚洲激精日韩激精欧美精品| 牛牛影视久久网| 一本大道av伊人久久综合| 久久久精品国产99久久精品芒果| 亚洲国产婷婷| 国产精品一区二区在线观看网站| 久久婷婷久久| 亚洲男人的天堂在线aⅴ视频| 欧美成黄导航| 久久国产精品久久久| aa成人免费视频| 原创国产精品91| 国产精品亚洲综合| 欧美精品播放| 久久综合中文字幕| 午夜精品一区二区三区四区| 亚洲区在线播放| 麻豆精品视频在线观看| 性色一区二区三区| 一区二区激情| 亚洲精美视频| 玉米视频成人免费看| 国产精品尤物| 欧美性猛交xxxx乱大交退制版| 亚洲精品网站在线播放gif| 怡红院精品视频| 国产精品爽黄69| 欧美日韩精品一区视频| 久久免费的精品国产v∧| 亚洲影院高清在线| 亚洲精品综合精品自拍| 欧美国产日韩一二三区| 久久久久久久久久久久久久一区| 亚洲视频在线视频| 亚洲久色影视| 亚洲激情综合| 亚洲国产成人porn| 在线精品高清中文字幕| 好看的日韩av电影| 国产一区二区三区在线观看免费视频| 欧美午夜精品| 欧美视频中文在线看| 欧美日韩国产三区| 欧美精品自拍| 欧美午夜欧美| 国产精品久久久久久久久婷婷| 欧美日本在线观看| 欧美日韩国产成人高清视频| 欧美精品一区二区三区久久久竹菊| 免费在线观看日韩欧美| 欧美精品激情在线观看| 欧美精品二区| 国产精品扒开腿爽爽爽视频| 国产精品理论片| 国产视频一区二区在线观看| 国产一区二区三区高清| 曰本成人黄色| 99精品视频免费观看| 亚洲小视频在线观看| 一本色道久久精品| 亚洲综合精品自拍| 久久久久久久综合狠狠综合| 猫咪成人在线观看| 亚洲精品免费一区二区三区| 亚洲视频一二三| 久久国产精品一区二区| 免费观看在线综合色|