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)在编写子程序的时候,不要使用会产生冲突的寄存器。
可行性分析
用栈来保存寄存器中的内容