彙編 第二節

2021-06-11 08:56:52 字數 4825 閱讀 7453

第二節

cpu主要有有運算器,控制器,暫存器,三部分組成

8086 cpu有14個暫存器,如ax,bx,cx,dx,si。。。。

8086所有暫存器都是16位的,可以存放2個byte即位元組,16位二進位制數  所能存放的最大數值是:11111111111: 2^16-1(從0開始,所以-1嘛)

通用暫存器為4個,是:ax,bx,cx,dx

為了相容8088 cpu,所有通用暫存器,可以單獨分為兩個暫存器使用,即高位址和低位址,如ax可分,ah,al 低8位:0-7 高八位:8-15

乙個位元組,即8bit,可以存在8位暫存器中

乙個字 word 等於2個位元組,即16bit

在寫一條彙編指令或暫存器時不區分大小寫

mov ax,10和mov,ax,10 一樣

mov ax,18 意思是把18送入暫存器ax

mov ah,18 意思是把18送入暫存器ah

mov ax,bx 意思是把bx的值輸入暫存器ax中

add ax,5  意思是將暫存器ax的值加上5

add ax,bx 意思是吧bx和ax相加,值存入ax中

h為16進製制的意思

ax=0000h 

bx=0000h

十六進製制的一位相當於二進位制的4位。。。。。由於1個記憶體單元可以存放8位資料,cpu中的暫存器又可存放n個8位的資料

例如:8226h+

8226h=

1044c (其中1會被拋棄,16位只能存放16位) 

8086 16位 乙個暫存器能儲存16個2進製數 

例如:al和ah沒有關係,當ah的值超出8位時,cpu就會丟棄資料,當al的值超出8位時,cpu不會丟棄資料

但不會進製到ah暫存器中

彙編指令進行操作時,要注意雙方位數和資料大小溢位問題

檢測點2.1詳解:

mov ax,62627           ax=f4a3h

記住,這裡的62627是十進位制,轉換為十六進製制後,就是f4a3

mov ah,31h             ax=31a3h

意思,是把31值送入ah中,並覆蓋,即31a3h

mov al,23h             ax=3123h

意思,是把23值送入al中,並覆蓋,即3123h

add,ax,ax             ax=6246h

意思就是把ax加上ax在送入ax中,和c語言的a+=a;乙個意思

mox bx,826ch           bx=826ch

意思就是把826ch的值送入bx中

mov cx,ax              cx=6246h

意思就是把ax的值覆蓋cx中

mov ax,bx              ax=826ch

意思就是把bx的值覆蓋ax中

add ax,bx              ax=04d8h

意思是把bx和ax的值相加,並送入ax中,結果為104d8,

超過8086 cpu的十六位儲存大小,所以拋棄1,即得04d8h

mov al,bh              ax=0482h

意思是把bh的值覆蓋al中,bh為82,ax為04d8,覆蓋得0482h

mov ah,bl              ax=6c82h

意思是把bl的值覆蓋ah中,bl為6c,ax為0482,覆蓋得6c82h

add ah,ah              ax=d882h

意思是把ah加上ah,值放入ah中,即6c+6c=d8,即得d882h

add al,6               ax=d888h

意思把6加入al中,al值為82,82+6即得88,當然是十六進製制演算法,最後得d888h

add al,al              ax=d810h

意思是把al加上al的值放入al中,值為110,超出al8位暫存器的大小,故只留10

結果為d810h

mov ax,cx              ax=6246h

此題作者怎麼想得,最後問個最簡單的,呵呵

對cpu而言,所有記憶體單元構成的儲存空間是乙個一維線性空間

cpu實體地址送入暫存器的只能是乙個實體地址,如:0010

8086為16位cpu,16為cpu有以下特性

運算器一次最多處理16位資料

暫存器的寬度為16位

暫存器和運算器的通路為16位

8086有20位位址匯流排,即可傳送20位資料,定址能力為:2的20次方位元組,即1mb

但8086為16位結構,每次處理,儲存,傳送都為16位,即定址能力為2的16次方個位元組,即64kb

為了不浪費使用吧,8086採用內部2個16位暫存器合成乙個20位實體地址就行傳輸

具體為:

x進製的數每高一位 他代表的值就是原來的x倍

實體地址=段位址*16+偏移位址,注意,這裡*16是16進製制,和10進製*10的意義一樣

例如:段位址為1230,偏移位址為00c8 那經過運算就是123c8的20位實體地址

具體:1230*16=12300

然後:12300+00c8=123c8

十進位制理解就是:

例如:12812這個數由

1000和2812組成

1000*10=10000

任何10000+2812=12812

自己慢慢理解理解就可以了!

段位址的概念,是來自cpu,來分段管理記憶體!

10000h——100ffh組成乙個段

基礎位址為10000h

段位址為1000h

大小為:

100h

這裡的段位址大小,很多人都暈,確實難理解,想通就好

100ffh—10000h=ffhui]

這個ffh,轉換為10進製就255,而計算機是從零開始,那麼就有0—255,256個數

再把256轉換為16進製制,那就是100,即大小為100h,這是最笨的方法,但初學者好理解些,呵呵

乙個段位址必然是16的倍數

偏移位址為16位,16位定址能力為64kb,乙個段的最大為64kb

實體地址

cpu訪問內在單元時,要給出記憶體單元的位址。所有的記憶體單元構成的儲存空間是乙個一維的線性空間,每乙個記憶體單元在這個空間中都有惟一的位址,我們將這個惟一的位址稱為實體地址。

cpu通過位址匯流排送入儲存器的必須是乙個記憶體單元的實體地址。在cpu向位址匯流排上發出實體地址之前,必須在內部先形成這個實體地址。不同的cpu可以有不同的形成實體地址的方式。下面討論8086cpu是如何在內部形成記憶體單元的實體地址的。

8086cpu16位結構的cpu,具有下面幾方面的結構特性:

8086cpu讀寫記憶體的過程:

cpu中的相關部件提供兩個16位的位址,乙個稱為段位址,另乙個稱為偏移位址;

段位址和偏移位址通過內部匯流排送入乙個稱為位址加法器的部件;

位址加法器將兩個16位位址合成為乙個20位的實體地址;

位址加法器通過內部匯流排將20位實體地址送入輸入輸出控制電路;

輸入輸出控制電路將20位實體地址送上位址匯流排;

20位實體地址被位址匯流排傳送到儲存器。

位址加法器採用實體地址=段位址*16+偏移位址的方法用段位址和偏移位址合成實體地址。

cpu可以用不同的段位址和偏移位址形成同乙個實體地址。例如:cpu要訪問21f60h單元,則它給出的段位址sa和偏移位址ea滿足sa*16+ea=21f60h即可。

如果給定乙個段位址,僅通過變化偏移位址來進行定址,最多可定位多少記憶體單元?

偏移位址16位,變化範圍為0~ffffh,僅用偏移位址來定址最多可尋64kb個記憶體單元。

比如給定段位址1000h,用偏移位址定址,cpu的定址範圍為:10000h~1ffffh。

監測點2.2:

1.00010h—1000fh

0010h-1000fh 有答案是這個,不知道0010h行不行,大家研究!

2.20000h

sa*16+0000=20000

sa*16+ffff=20000

最大2000

最小1001 1000不行,最後只能1001,大家測試

--cs 與ip 

8086 cpu通過段位址和偏移合成實體地址來定址,所以段位址肯定有暫存器,

那就是:cs ds,ss,es 4個,和前面我們說的4個通用暫存器:ax,bx,cx,dx一樣

cs和ip這兩個暫存器,cs為**段暫存器,ip為指令指標暫存器,8086會從

cs*16+ip單元開始讀取指令

關鍵要理解8086cpu的工作過程:

1.從cs:ip指向德記憶體單元讀取指令,指令進入緩衝器

2.ip=ip+所讀指令的長度,從而指向下一條指令

3.執行指令,轉到步驟一,重複這個過程

記住:8086cpu加電復位後,cs和ip的設定為cs=ffffh,ip=0000h

即cpu從記憶體ffff0h單元中讀取執行,也是8086cpu的第一條執行指令

jmp 指令:

jmp 某一合法暫存器,指令的功能為: 用暫存器的值修改ip,  eg: jmp  ax : 把ax 的設定成ip 的值,類似mov ip, ax 的,但是是不存在這樣的語法的,而是用mov 指令來說明jmp 命令的功能  。。   jmp 3:01b6  可以這樣理解: mov cs,3 (注意此時的3要*16)    mov ip,o1b6  

debug進入方式:開始—執行——debug xp系統下

r檢視當前暫存器值,修改

d檢視記憶體位址段的內容

e修改記憶體位址中的內容

u將記憶體位址段的內容翻譯為指令

t執行開始cs:ip處的指令

a輸入彙編指令

實驗任務,根據各自電腦不同,初始值可能不同!大家自己測試,很簡單!

函式第二節

coding utf 8 1.定義乙個方法get num num num引數是列表型別,判斷列表裡面的元素為數字型別。其他型別則報錯,並且返回乙個偶數列表 注 列表裡面的元素為偶數 def get num l l for i in l 判斷列表l的元素是否都為整形 if not isinstance...

第二節練習

a b 2 鏈式賦值 print a print b c id a 位址print c c type a 型別 print c a,b 2,3 系列解包賦值 a,b b,a print a print b 基本運算 print 3 2 print 30 5 print 30 5 print 30 5...

物件導向第二節

coding utf 8 定義乙個列表的操作類 listinfo 包括的方法 1 列表元素新增 add key keyname keyname 字串或者整數型別 2 列表元素取值 get key num num 整數型別 3 列表合併 update list list list 列表型別 4 刪除並...