题目:
请编程序完成下面的任务。题目要求:编制一个子程序,求y=x^4,x为字节,y为字,且不会溢出
版本1:
子程序的参数由寄存器bl提供,返回结果在ax中;
请在下面代码的基础上完成:
assume cs:codesg, ss:stacksg
stacksg segment
db 32 dup (0)
stacksg ends
codesg segment
main proc
start: mov ax,stack
mov ss,ax
mov sp,16
mov bl,8 ;为调用子程序准备参数
call subp
;子程序调用返回后要做的处理
mov ax,4c00h
int 21h
main endp
;子程序功能:求y=x^4
;入口参数:x的值由bl提供
;返回值:y值由ax返回,且y值不会超过1个字的范围
subp proc
;子程序中使用的寄存器入栈
;子程序内容
;子程序使用的寄存器出栈
ret
subp endp
codesg ends
end start
版本1解答:
我完成的程序如下(缩格排放,适量注释):
assume cs:codesg, ss:stack
stack segment
db 32 dup (0)
stack ends
codesg segment
main proc
start: mov ax,stack
mov ss,ax
mov sp,16
mov bl, 8 ;为调用子程序准备参数
call subp
;子程序调用返回后要做的处理
mov ax,4c00h
int 21h
main endp
;返回值:y值由ax返回,且y值不会超过1个字的范围
subp proc
push cx ;子程序中使用的寄存器入栈
mov bh,0 ;子程序内容
mov dx,0
mov ax,0
mov al,bl
mov cx,3
s: mul bx
loop s
pop cx
ret
subp endp
codesg ends
end start测试方法:DosBos
运行后结果:
版本2:
子程序不变,主程序中提供如下数据区,在主程序中,循环调用子程序,完成y=x^4的求解,并将结果存入在相应的数据区:
data segment
x db 1,2,3,4,5,6,7,8
y dw 0,0,0,0,0,0,0,0
data ends
版本2解答:
我完成的程序如下(缩格排放,适量注释):
assume cs:codesg, ss:stack,ds:data
data segment
x db 1,2,3,4,5,6,7,8
y dw 0,0,0,0,0,0,0,0
data ends
stack segment
db 32 dup (0)
stack ends
codesg segment
main proc
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov cx,8
mov si,0
mov di,8
s_1: mov bl,[si] ;为调用子程序准备参数
call subp
mov [di],ax
inc si
inc di
inc di
loop s_1
mov ax,4c00h
int 21h
main endp
subp proc
push cx ;子程序中使用的寄存器入栈
mov bh,0 ;子程序内容
mov dx,0
mov ax,0
mov al,bl
mov cx,3
s: mul bx
loop s
pop cx
ret
subp endp
codesg ends
end start
测试方法:
运行后结果:
版本3:
数据区不变,子程序要完成全部8个数据的求解任务,主程序只调用一次子程序即可。数据x的起始偏移地址由si提供,存放结果的y的偏移地址,由di提供,在调用前,由主程序为子程序提供si、di值。
版本3解答:
我完成的程序如下(缩格排放,适量注释):
a
ssume cs:codesg, ss:stack,ds:data
data segment
x db 1,2,3,4,5,6,7,8
y dw 0,0,0,0,0,0,0,0
data ends
stack segment
db 32 dup (0)
stack ends
codesg segment
main proc
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov si,0
mov di,8
call subp
mov ax,4c00h
int 21h
main endp
subp proc
push cx ;子程序中使用的寄存器入栈
mov cx,8
s_1: mov bl,[si]
mov bh,0
mov dx,0
mov ax,0
mov al,bl
push cx
mov cx,3
s_2: mul bx
loop s_2
pop cx
mov [di],ax
inc si
inc di
inc di
loop s_1
pop cx
ret
subp endp
codesg ends
end start
测试方法:
运行后结果:
版本4:
将上面的程序按多文件的方式存放。
版本4解答:
我完成的程序如下(缩格排放,适量注释):
extrn subp:far
assume cs:codesg, ss:stack,ds:data
data segment
x db 1,2,3,4,5,6,7,8
y dw 0,0,0,0,0,0,0,0
data ends
stack segment
db 32 dup (0)
stack ends
codesg segment
main proc
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov si,0
mov di,8
call subp
mov ax,4c00h
int 21h
main endp
codesg ends
end start
public subp
assume cs:codesg
codesg segment
subp proc far
push cx ;子程序中使用的寄存器入栈
mov cx,8
s_1: mov bl,[si]
mov bh,0
mov dx,0
mov ax,0
mov al,bl
push cx
mov cx,3
s_2: mul bx
loop s_2
pop cx
mov [di],ax
inc si
inc di
inc di
loop s_1
pop cx
ret
subp endp
codesg ends
end
测试方法:
运行后结果:
方法体味:如果有一个题目,要求你直接完成版本4的工作,你是否会意识到可以从版本1开始起步,逐步加量到版本4?如果要给这种方法起一个名字,你愿意叫它什么?