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)在編寫子程序的時候,不要使用會產生衝突的寄存器。
可行性分析
用棧來保存寄存器中的內容