作业报告(第9讲)

题目:

请编程序完成下面的任务。题目要求:编制一个子程序,求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?如果要给这种方法起一个名字,你愿意叫它什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值