彙編語言第七章&實驗六
7.1 and和or指令
and指令,邏輯與指令,按位進行與運算
mov al,01100011B
and al,00111011B
執行後al=00100011B,通過該指令可將操作對象的相應位設爲0,其他位不變
or指令,邏輯或指令,按位進行或運算
mov al,01100011B
or al,00111011B
執行後al=01111011B ,通過該指令可將操作對象的相應位設爲1,其他位不變
7.2 關於ASCII碼
我們把信息存儲在計算機中,就要對其進行編碼,轉化爲二進制信息,而計算機將存儲的信息顯示給我們看,就要進行解碼,ASCII碼就是一種編碼方案
在編輯文本時按下a鍵,這個按鍵的信息傳入計算機,計算機編碼後轉化爲61H存儲在內存中,文本編輯軟件從內存中取出61H,將其送到顯卡上的顯存中,工作在文本模式下的顯卡,用ASCII碼的規則解釋顯存中的內容,61H被當作字符a,顯卡驅動顯示器將字符a的圖像畫在屏幕上
7.3 以字符形式給出的數據
在彙編程序中,用’……'的方式指明數據是以字符的形式給出的,編譯器將它們轉化爲對應的ASCII碼
assume cs:code,ds:date
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
db ‘unIX’相當於’db 75H,6EH,49H,58H’
mov al,'a’相當於mov al,61H
7.4 大小寫轉換的問題
將datasg中的第一個字符串轉化爲大寫,第二個字符串轉化爲小寫
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-awc0M48Y-1583139213436)(C:\Users\田明浩\AppData\Roaming\Typora\typora-user-images\image-20200302130808763.png)]
第一種方法,觀察到小寫字母的ASCII碼值比對應的大寫字母ASCII碼值大20H,但是由於字符串中既有大寫又有小寫,需要進行判斷是否爲大寫或者小寫,但目前還沒學過使用匯編的判斷語句
第二種方法,從ASCII碼的二進制形式來看,除第5位(從0開始計數)外,其他各位都一樣,所以對於一個字母,不管大寫小寫,將第5位置置零即可
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNdOrMaTiOn'
datasg ends
codesg sgement
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,0
s:mov al,[bx]
and al,11011111B
mov [bx],al
inc bx
loop s
mov bx,5
mov cx,11
s0:mov al,[bx]
or al,00100000B
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
7.5 [bx+idata]
可以用[bx+idata]表示一個內存單元,它的偏移地址爲(bx)+idata
以下指令等價
mov ax,[bx+200]
mov ax.[200+bx]
mov ax,200[bx]
mov ax,[bx].200
7.6 用[bx+idata]的方式進行數組的處理
在codesg中填寫代碼,將datasg中定義的第一個字符串轉化爲大寫,第二個字符串轉化爲小寫
原來的方法需要兩個循環,但在同一個循環裏也可以完成
assume cs:code,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start: 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,4c00H
int 21H
codesg ends
end
比較c語言和彙編語言
C:a[i],b[i]
彙編:0[bx],5[bx]
7.7 SI和DI
si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成兩個8位寄存器來使用
下面3組指令功能相同
mov bx,0
mov ax,[bx]
mov si,0
mov ax,[si]
mov di,0
mov ax,[di]
用si和di實現將字符串’welcome to masm!'複製到它後面的數據區中
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg sgement
start: mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 16[si],ax
add si,2
loops
mov ax,4c00h
int 21h
codesg ends
end start
7.8 [bx+si]和[bx_di]
[bx+di]即偏移地址爲(bx)+(si)
以下指令等價
mov ax,[bx+si]
mov ax,[bx][si]
7,9 [bx+si+idata]和[bx+di+idata]
[bx+si+idata]即(bx)+(si)+idata
常用格式
mov ax,[bx+si+200]
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
7.10 不同尋址方式的靈活應用
將datasg段中每個單詞的頭一個字母改爲大寫字母
assume cs:codesg,ds:datasg
datasg segment
db '1. file ' ;每個字符串長度爲16個字節,因爲連續存放
db '2. edit ' ;加空格保證兩個字符串不在同一個段中
db '3. search '
db '4 .view '
db '5. options '
db '6. help '
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov cx,6
s:mov al,[bx+3]
and al,11011111B
mov [bx+3],al
add bx,16
loops
mov ax,4c00h
int 21h
codesg ends
end start
將datasg段中每個單詞改爲大寫字母,這樣就要用到二重循環,但是兩個循環都要用到cx,所以需要暫存外層循環cx的值,可以使用寄存器暫存,但是一般來說,在需要暫存數據的時候,我們都應該使用棧
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0 ;定義一共棧段,容量爲16個字節
stacksg ends
codesg segment
start: mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx ;外層循環的cx壓棧
mov si,0
mov cx,3
s:mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loops
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
實驗六
編程,將datasg段中每個單詞的前4個字母改爲大寫字母
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start: mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx
mov si,3
mov cx,4
s0:push cx
mov si,3
mov cx,4
s:mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s
pop cx
add bx,16
loop s0
mov ax,4c00h
int 21h
codesg ends
end start