mul寄存器
mul内存单元
(1)计算100*10
分析100和10小于255可以做8位乘法
程序:
mov al,100
mov bl,10
mul bl
结果(ax)= 1000(038E)
(2)计算100000*100
分析100000*100的结果肯定是大于8位
程序
mov ax,100
mov bx,100000
mul bx
结果: (ds)=000Fh (ax)=4240H
即F4240H = 1000000
模块化程序设计
问题 根据提供的n 计算n的3次方
考虑
我们将参数n存储在什么地方
计算得到的数值 存储在什么地方
方案
用寄存器传递参数
用内存单元进行参数传递
用栈传递参数
用寄存器存储参数和结果都是最常用的方法
编程任务 计算data段中数据的3次方结果保存在后面一组dword单元中,这样代码虽然可以解决问题,但是涉及了大量的寄存器,如果需要传递的数据有3个、4个或更多,寄存器如何解决呢?
assume cs:codesg
data segment
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends
codesg segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov bx,[si]
call cube
mov [di],ax;低地址的16位
mov [di+2],dx;高地址的16位
add si,2
add di,4
loop s
cube:
mov ax,bx
mul bx
mul bx
ret
codesg ends
end start
; 用内存单元批量传递数据将data段中的字符串转化成大写
assume cs:code
data segment
db 'conversation'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,12
call capital
mov ax,4c00h
int 21h
capital:
and byte ptr[si],11011111b
inc si
loop capital
ret
code ends
end start
;用栈传递参数计算(a-b)^3 a,b为word型数据
assume cs:code
code segment
start:
mov ax,1
push ax
mov ax,3
push ax
call difucbe
mov ax,4c00h
int 21h
difucbe:
push bp
mov bp,sp
mov ax,[bp+4]
mov ax,[bp+6]
mov bp,ax
mul bp
mul bp
pop bp ;返回到call ip所指向的地方
ret 4 ; pop ip; add n
code ends
end start
; 进入子程序 参数a,b入栈
; 调用子程序 使栈顶存放ip
; 需要注意的是子程序要用bp是一个重要的技术,为避免丢死有用的数据,先入栈,返回前出栈。