數據處理的兩個基本問題
處理的數據在什麼地方?
要處理的數據有多長?
定義,利用reg表示寄存器;sreg表示一個段寄存器
reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;
sreg的集合包括:ds,ss,cs,es;
一、在8086CPU中,只有4個寄存器能夠[...]中來進行內存單元的尋址。
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
下面指令是錯誤的:
mov ax,[bx+bp]
mov ax,[si+di]
注:只要在[....]中使用寄存bp,而指令中沒有顯性地給出段地址,段地址就默認在ss中。
------------
二、機器指令處理的數據在什麼地方
指令在執行前,所要處理的數據能夠在3個地方,CPU內部、內存、端口;
mov bx,[0];在內存中
mov bx,ax ;在cpu內部,ax寄存器
mov bx,1; cpu內部,指令緩衝器
--------------
三、彙編語言中數據位置的表達
1)、當即數(idata)
對於直接包含在機器指令中的數據(執行前在CPU的指令緩衝器中);如:
mov ax,1
add bx,2000h
or bx,00100000b
mov al,'a'
2)、寄存器
指令要處理的數據在寄存器中,如:
mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
mov ss,ax
3)、段地址(SA)和偏移地址(EA)
指令要處理的數據在內存中
存放段地址的寄存器能夠是默認的
mov ax,[0]
mov ax,[di]
mov ax,[bx+8]
----------------
四、尋址方式
直接尋址:[idata]
寄存器間接尋址:[bx]
寄存器相對尋址:[bx].idata;idata[si],[bx][idata]
基址變址尋址:[bx][si]
相對基址變址尋址:[bx].idata[si],idata[bx][si]
----------
五、指令要處理的數據有多長
8086CPU的指令,能夠處理兩種尺寸的數據,byte和word。
mov ax,1 ;字的操做,兩個字節
mov al,1; 字節的操做,一個字節
利用 word ptr指明訪問的內存單元時一個字
mov word ptr ds:[0]:1
利用byte ptr 指明瞭指令訪問的內存單元時一個字節
mov byte ptr ds:[0],1
注:在沒有寄存器參與的內存單元訪問指令中,用word ptr和byte ptr顯性地指明所要訪問的內存單元長度是頗有必要的。
mov ax,2000h
mov ds,ax
mov byte ptr [1000h],1
-----------
七、div指令(除法)
1)、除數:有8位和16位兩種,在一個reg或內存單元中。
2)、被除數:默認放在AX或DX和AX中,若是除數爲8位,被除數則爲16位,默認在AX中存放;若是除數爲16位,被除數則爲32位,在DX和AX中存放,DX放高16位,AX存放低16位
3)、結果:若是除數爲8位,則AL存儲除法操做的商,AH存儲除法操做的餘數;若是除數爲16位,則AX存儲除法操做的商,DX存儲除法操做的餘數
格式如:
div reg
div 內存單元
div byte ptr ds:[0];表示除數是一個內存單元8位,那麼被除數是在ax中,al存放商,ah存放餘數
--------
八、僞指令dd
前面db是定義字節型數據
dw是定義字型數據
dd是定義雙字型數據;兩個字,這裏的話也就是4個字節
db 1;佔一個字節
dw 1;佔一個字;2個字節
dd 1;佔兩個字;4個字節
----------
九、僞指令dup
dup是一個操做符,用來進行數據的重複;
db 3 dup(0)
定義了3個字節,它們的值都是0,至關於db 0,0,0;也就是dup(0),0是一個字節,重複3次;
db 3 dup(0,1,2);dup裏面3個字節,重複3次,也就是0,1,2,0,1,2,0,1,2共9個字節
--------------
第九章
轉移指令原理
能夠修改IP,或同時修改cs和IP的指令統稱爲轉移指令。轉移指令就是能夠控制CPU執行內存中某處代碼的指令;
8086CPU的轉移行爲:
一、只修改IP時,稱爲段內轉移,好比jmp ax。
二、同時修改cs和ip,稱爲段間轉移,好比:jmp 1000:0
因爲轉移指令對IP的修改範圍不一樣,段內轉移又分爲:短轉移和近轉移。
一、短轉移IP的修改範圍爲-128至127
二、近轉移IP的修改 範圍爲-32768至32767
8086CPU的轉移指令分爲:
一、無條件轉移指令(如:jmp)
二、條件轉移指令
三、循環指令(如:loop)
四、過程
五、中斷
-------
一、操做符offset
offset在彙編語言中是由翻譯器處理的符號,它的功能是取得標號的偏移地址。
assume cs:codesg
codesg segment
start: mov ax,offset start ;至關於mov ax,0
s: mov ax,offset s;至關於mov ax,3
codesg ends
end start
上面代碼中,操做符offset取得了標號start和s偏移地址0和3。start是代碼段中的標號,它所標記的指令是代碼段中的第一條指令,偏移地址爲0;
mov ax,offset s至關於指令mov ax,3,由於s是代碼段的標號,它所標記的指令是代碼段的第二條指令,第一條指令長度爲3個字節,則s的偏移地址爲3
--------------
二、jmp指令
jmp short 標號(短轉移)
assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp short s
add ax,1
s: inc ax
codesg ends
end start
注:jmp位移的範圍是-128至127,向上128位字節,向下127字節;
jmp near ptr 標號:段內近轉移,16位位移的範圍爲-32768至32767。
---------
四、轉移的目的地址在指令中的jmp指令
前面講的jmp指令,其對應的機器指令中並無轉移的目的的地址,而是相對於當前IP的轉移位移。
"jmp far ptr 標號"實現的是段間轉移,又稱爲遠轉移。
(CS)=標號所在段的段地址;(IP)=標號在段中的偏移地址。
far ptr指明瞭指令用標號的段地址和偏移地址修改CS和IP。
-----
五、轉移地址在寄存器中的jmp指令
指令格式:jmp 16位reg
功能(IP)=(16位reg)
-----
六、轉移地址在內存中的jmp指令
1)jmp word ptr 內存單元地址(段內轉移)
mov ax,0123h
mov ds:[0],ax
jmp word ptr ds:[0]
2)jmp dword ptr內存單元地址(段間轉移)
功能:從內存單元地址處開始存放着兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的目的偏移地址。
(CS)=(內存單元地址+2)
(IP)=(內存單元地址)
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
----------------
七、jcxz指令
jcxz指令爲有條件轉移指令,全部的條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改範圍都爲:-128z至127
指令格式:jcxz標號(若是(cx)=0,轉移到標號處執行。)
當(cx)!=0時,什麼也不作,
」jcxz 標號"的功能至關於:if((cx)==0) jmp short 標號oop
mov cx,[bx]
jcxz ok
-----------
八、loop指令
loop指令爲循環指令,全部的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改範圍爲:-128-127
"loop 標號"的功能至關於:
(cx)--;
if((cx)!=0) jmp short 標號;
----------
顯存的空間:B8000H-BFFFFH共32KB的空間;向顯存寫入數據,那麼就會在顯示器上顯示。
一個字符佔兩個字節,前面一個是ASCII碼,後面一個是屬性(顏色)【p190頁】
------------
NOP"指令即空指令
運行該指令時單片機什麼都不作,可是會佔用一個指令的時間
當指令間須要有延時(給外部設備足夠的響應時間;或是軟件的延時等),能夠插入「NOP」指令。
-----------------
第十章、CALL和RET指令
call和ret指令都是轉移指令,它們都修改IP或同時修改CS和IP。
-------------
一、ret和retf
ret指令用棧中的數據,修改IP的內容,從而實現近轉移;
retf指令用棧中的數據,修改CS和IP的內容,從而實現遠轉移;
CPU執行ret指令時,至關於:pop IP;將棧頂的值賦給IP
CPU執行retf指令時,至關於pop IP pop CS;
------
assume cs:code
stack segment
db 16 dup(0)
stack ends學習
code segment
mov,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push ax
mov bx,0
ret
code ends
end start
上面程序,設置前兩句是設置棧的段地址,將ax放入棧中,ret的命令是從棧頂中獲取值(ax)=0賦予IP,這時的(IP)=0,下一條指令指向的是(IP)=0,指令的偏移地址爲0,也是程序的第一條指令mov 4c00h,這是退出程序的指令
---------
assume cs:code
stack segment
db 16 dup(0)
stack endsspa
code segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push cs
push ax
mov bx,0
retf
code ends
end start
上面程序先設置棧的段地址、偏移地址;先將棧的段地址壓入棧中,再將寄存器ax壓入棧中,而後經過retf命令從棧中取出,先將寄存器ax(內容爲0)從棧中取出,放入IP寄存器中,而後從棧中將cs取出放入寄存器CS中。這樣下一條指令指向的段地址:偏移地址就是cs:ip;這裏的(IP)=0
--------------
二、call指令
call指令常常跟ret指令配合使用,所以CPU執行call指令,進行兩步操做
一、將當前的IP或CS和IP壓入棧中
二、轉移(jmp)
call指令不能實現短轉移,
---
「call 標號":將當前的IP壓入棧後,轉到標號處執行指令;
功能:至關於執行標號,當執行完後能夠從棧中取出call指令發出所在的IP地址,用做返回;好比說在一個方法中調用了另一個方法,執行完方法後,返回繼續執行當前方法剩下的程序。
call 標號:16位位移="標號"處的地址-call指令後第一個字節的地址
-------------
「call far ptr 標號"這種格式的call指令操做:
1)(sp)=(sp)-2
((ss)*16+(sp))=(cs)
(sp)=(sp)-2
((ss)*16+(sp))=(Ip)
先將原來的段地址:偏移地址保存到棧中
2)(cs)=標號所在的段地址
(ip)=標號所在的偏移地址
至關於:
push cs
push ip
jmp far ptr 標號
---------
call word ptr 內存單元地址
彙編語法解釋
push IP
jmp word ptr 內存單元地址
--------
call與ret結合使用
assume cs:code
code segment
start: mov ax,1
mov cx,3
call
mov bx,ax
mov ax,4c00h
int 21h
s: add ax,ax
loop s
ret
code ends
end start
上面程序分析:當程序執行到call時,會將call下面一條指令的IP地址壓入棧中,接着跳轉到標號s程序處,執行循環操做,當(cx)=0跳出循環,ret指令將棧頂元素賦給寄存器IP,程序的指令會執行CS:IP處,這裏就是mov bx,ax;(bx)=8,而後執行結束指令,結束程序;(p53要學習)
-----------
mul是乘法指令
一、兩個相乘的數:要麼都是8位,要麼都是16位。若是是8位,一個默認放在AL中,另外一個放在reg或內存字節單元中;若是是16位,一個默認在ax中,另外一個放在16位reg或內存字單元中
二、結果:若是是8位乘法,結果默認放在ax中,若是是16位乘法,結果高位默認在dx中存放,低位在ax中放。
mul reg
mul 內存單元
mul byte ptr ds:[0] ;al中的值與內存字節單元的值相乘,存放在ax中。
mul word ptr [bx+si+8];ax中的值與內存字單元的值相乘,高位放在dx中,低位放在ax中
---------
dec指令是自減
div指令是除法;通常都在ax中進行,除的商放在ax中,餘數放在dx中;如div cx;cx爲除數,
字節操做:16位被除數在AX,8位除數爲源操做數,結果的8位商在AL中,8位餘數在AH中。
字操做:32位被除數放在DX,AX中。其中DX爲高位字,16位除數爲源操做數,結果的16位端在AX中,16位餘數在DX中
雙字操做:64位被除數在EDX,EAX中,其中EDX爲高位雙字,32位除數爲源操做數,結果的32位商在EAX中,32位餘數在EDX中翻譯