第二節
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 刪除並...