彙編語言(王爽)第七章&實驗六

彙編語言第七章&實驗六

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章