彙編語言(王爽版)學習筆記 第十章 CALL和RET指令(2)

10.8 mul指令

mul是乘法指令。
(1)兩個相乘的數:要麼都是8位,要麼都是16位。都是8位,一個默認放在AL中,另一個放在8位reg或內存字節單元中。如果都是16位,一個默認在AX中,另一個放在16位reg或內存單元中。
(2)結果:如果是8位乘法,結果默認放在AX中;如果是16位乘法,結果高位默認放在DX中,低位放在AX中。

格式如下:
mul reg
mul 內存單元
內存單元可以用不同的尋址方式給出,比如:
mul byte ptr ds:[0]
含義:(ax)=(al)*((ds)*16+0)

mul word ptr [bx+si+8]
含義:
(ax)=(ax)*((ds)*16+(bx)+(si)+8)結果的低16位。
(ax)=(ax)*((ds)*16+(bx)+(si)+8)結果的高16位。
例:
(1)計算100*10
100和10小於255,可以做8位乘法,程序如下。
mov al,100
mov bl,10
mul bl
結果:(ax)=1000(03E8H)

(2)計算100*10000
100小於25,10000大於255,所以必須做16位乘法(100高位補0補成16位)。程序如下。
mov ax,100
mov bx,10000
mul bx
結果:(ax)=4240H,(dx)=000FH,(1000000=F4240H)

10.9 模塊化程序設計

在這裏插入圖片描述

10.10 參數和結果傳遞的問題

在這裏插入圖片描述
在這裏插入圖片描述

編程:計算data段中第一組數據的3次方,結果保存在後面一組的dword單元中。

assume cs:code
	data segment
		dw 1,2,3,4,5,6,7,8
		dd 0,0,0,0,0,0,0,0
	data ends

	code segment
		start:mov ax,data
			  mov ds,ax		;ds指向data段
			  mov si,0		;ds:si指向第一組word單元
			  mov di,16		;ds:di指向第二組dword單元
			  
			  mov cx,8
			s:mov bx,[si]
			  call cube		;計算立方
			  mov [di],ax	;存儲結果低位
			  mov [di].2,dx		;存儲結果高位
			  add si,2		;ds:si指向下一個word單元
			  add di,4		;ds:di指向下一個dword單元
			  loop s
			  
			  mov ax,4c00h
			  int 21h
			  
		cube: mov ax,bx
			  mul bx
			  mul bx
			  ret
			  
	code ends
end start

10.11 批量數據的傳遞

在這裏插入圖片描述
在這裏插入圖片描述

編程,將data段中的字符串轉化爲大寫。

assume cs:code
	data segment
		db 'conversation'
	data ends
	
	code segment
		start:mov ax,data
			  mov ds,ax
			  mov si,0		;ds:si指向字符串(批量數據)所在空間的首地址
			  mov cx,12		;cx存放字符串的長度
			  call capital
			  mov ax,4c00h
			  int 21h
			  
		capital:and byte ptr [si],11011111b
			    inc si
				loop capital
				ret
	
	code ends
end start

10.12 寄存器衝突的問題

在這裏插入圖片描述
在這裏插入圖片描述

問題10.2

解決方案
(1)在編寫調用子程序的程序時,注意看看子程序中有沒有用到會產生衝突的寄存器,如果有,調用者使用別的寄存器;
(2)在編寫子程序的時候,不要使用會產生衝突的寄存器。

可行性分析
在這裏插入圖片描述
用棧來保存寄存器中的內容
在這裏插入圖片描述

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