您好,登錄后才能下訂單哦!
(一)and和or指令
and指令:邏輯與指令,按位進行與運算
mov al,01100011B
and al,00111011B
執行后,al=00100011B
作用:通過該指令可將操作對象的相應位設為0,其他位不變。
or指令:邏輯或指令,按位進行或運算
mov al,01100011B
or al,00111011B
執行后:al=011111011B
作用:通過該指令可將操作對象的相應位設為1,其他位不變。
(二)關于ASCII碼
世界上有很多編碼方案,有一種方案叫做ASCII編碼,是在計算機系統中通常被采用的。簡單地說,所謂編碼方案,就是一套規則,它約定了用什么樣的信息來表示現實對象。比如說,在ASCII編碼方案中,用61H表示“a”,62H表示“b”。一種規則需要人們遵守才有意義。
一個文本編輯過程中,就包含著按照ASCII編碼規則進行的編碼和解碼。在文本編輯過程中,我們按一下鍵盤的a鍵,就會在屏幕上看到“a”。這是怎樣一個過程呢?我們按下鍵盤的a鍵,這個按鍵的信息被送入計算機,計算機用ASCII碼的規則對其進行編碼,將其轉化為61H存儲在內存的指定空間中;文本編輯軟件從內存中取出61H,將其送到顯卡的顯存中;工作在文本模式下的顯卡,用ASCII碼的規則解釋顯存中的內容,61H被當作字符“a”,顯卡驅動顯示器,將字符“a”的圖像畫在屏幕上。
(三)以字符形式給出的數據
我們可以在匯編程序中,用'...'的方式指明數據是以字符的形式給出的,編譯器將把它們轉化為相對應的ASCII碼,如下:
assume cs:code,ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start:mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
(四)大小寫轉換問題
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax ;設置ds指向datasg段
mov bx,0 ;設置(bx)=0,ds:bx指向'BaSiC'的第一個字母
mov cx,5 ;設置循環次數5,因為'BaSiC'有5個字母
s: mov al,[bx] ;將ASCII碼從ds:bx所指向的單元中取出
add al,11011111B ;將al中的ASCII碼的第5位置為0,變為大寫字母
mov [bx],al ;將轉變后的ASCII碼寫回原單元
inc bx ;(bx)加1,ds:bx指向下一個字母
loop s
mov bx,5 ;設置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一個字母
mov cx,11 ;設置循環次數11,因為'iNfOrMaTiOn'有11個字母
s0: mov al,[bx]
or al,00100000B ;將al中的ASCII碼的第5位置為1,變為小寫字母
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
code start
(五)[bx+idata]
在前面總結中,我們用[bx]的方式來指明一個內存單元,還可以用一種更為靈活的方式來指明內存單元:[bx+idata]表示一個內存單元,它的偏移地址為(bx)+idata,比如:
mov ax,[bx+200]
數學化的描述為:(ax)=((ds)*16+(bx)+200)
也可以寫為:
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
那這種方式有什么用呢?我們可以用[bx+idata]的方式進行數組的處理
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start:
codesg ends
end start
按照我們原來的方法,用[bx]的方式定位字符串中的字符。代碼段如下:
mov ax,datasg
mov ds.ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111B
mov [bx],al
inc bx
loop s
mov bx,5
mov cx,5
s0:mov al,[bx]
or al,00100000B
mov [bx],al
inc bx
loop s0
現在我們用[bx+idata]對上面的代碼進行簡化,如下:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111B
mov [bx],al
mov al,[5+bx]
or al,00100000B
mov [5+bx],al
inc bx
loop s
但也可以寫成下面這種:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,0[bx]
and al,11011111B
mov 0[bx],al
mov al,5[bx]
or al,00100000B
mov 5[bx],al
inc bx
loop s
如果我們用高級語言,比如C語言來描述上述程序,大致如下:
char a[5] = "BaSiC"; char b[5] = "MinIX"; main() { int i; i = 0; do { a[i] = a[i] & 0xDF; b[i] = b[i] & 0x20; i++; } while(i < 5); }
C語言:a[i],b[i]
匯編語言:0[bx],5[bx]
(六)SI和DI
si和di是8086CPU中和bx功能相近的寄存器,si和di不能夠分成兩個8位寄存器來使用
(七)[bx+si]和[bx+di]
[bx+si]和[bx+di]的含義相似,都表示一個內存單元,它的偏移地址為(bx)+(si)
mov ax,[bx+si]
數學化的描述為:(ax)=((ds)*16+(bx)+(si))
也可以寫成如下格式:
mov ax,[bx][si]
(八)[bx+si+idata]和[bx+di+idata]
[bx+si+idata]和[bx+di+idata]含義相似,表示一個內存單元,它的偏移地址為(bx)+(si)+idata
mov ax,[bx+si+idata]
數學化的描述為:(ax)=((ds)*16+(bx)+(si)+idata)
該指令也可寫成如下格式:
mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200
(九)不同的尋址方式的靈活應用
[idata]用一個常量來表示地址,可用于直接定位一個內存單元。
[bx]用一個變量來表示內存地址,可用于間接定位一個內存單元。
[bx+idata]用一個變量和一個常量表示內存地址,可在一個起始地址的基礎上用變量間接定位一個內存單元。
[bx+si]用兩個變量表示地址。
[bx+si+idata]用兩個變量和一個常量表示地址。
總結完畢!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。