汇编语言 第七章 子程序设计
汇编语言-子程序
STRUC可以把不同类型的数据放在同一个结构里,方便处理。
结构类型说明格式为:
structure_name STRUC
…
;DB、DW、DD等伪操作
structure_name ENDS
注意:ENDS之前为结构名,注意与段结束相区别。
例如:下列语句说明了一个名STUDENT的结构类型:
STUDENT STRUC
STRLEN1 : CMP AL , [SI] JZ Sቤተ መጻሕፍቲ ባይዱRLEN2 INC SI JMP STRLEN1
STRLEN2: MOV AX , SI SUB AX , [BP + 4] POP SI
POP DS POP BP RET STRLEN ENDP
主程序调用这个子程序的代码片段如下: PUSH AX PUSH AX MOV LEN , AX 如果过程和调用程序在同一文件(同 中的变量。
XOR SI , SI ;CF也会被清0
MADD1:MOV AX , WORD PTR DATA1[SI]
ADC AX , WORD PTR DATA2[SI]
MOV WORD PTR DATA3[SI] , AX
INC SI
INC SI
POP SI
LOOP MADD1
POP CX
MOV AL , 0
递归子程序的设计要点:
1. 递推性:逐级调用; 2. 回归性:逐层回归; 3. 有穷性:终止条件;
这3点为所有语言递归程序设计具有的共性。
汇编语言设计递归程序时的个性在于:
1. 参数和中间结果一般存于堆栈中,但有时也可以存于寄存器中; 2. 递归的深度受堆栈空间的限制。
例:子程序FACT采用递归算法实现阶乘。
汇编语言程序设计第七章 循环结构程序
2. LOOPE/LOOPZ 条件重复控制指令
指令汇编格式: LOOPE/LOOPZ AGAIN
操作: (1) CX CX-1
(2) 若CX≠ 0且ZF=1,则使控制转到AGAIN 标识的循环入口处,继续下一次循环,否则退出循 环体,执行后续指令。
例 比较两个字符串是否相等。
STR1 DB
‘12345’
DSEG SEGMENT
DATA DB
10,20,30,80,100,90,120
CNT DW 7
ADR DW 0FFFFH
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
START: MOV AX,DSEG MOV DS,AX
DATA1 00H
01H 00H 02H
: :
SI DATA2 00H
10H
50
00H
个
20H
字
单
:
元
:
DI SUM 00H
BX
00H
50
00H 50
个
00H
个
字 单
:
字 单
元
:
元
00H
00H
例7.1 设内存DATA1和DATA2开始分别存放50个无符 号字数据,编制程序将两个存储区对应字数据求和并存 入SUM开始的单元。
存储器中仅由字节或字组成的一组数据称为数据串。由字节组 成的数据串称为字节数据串,简称字节串;由字组成的数据串称为 字数据串,简称字串。一个数据串的长度最长不能超过64KB。
数据串操作指令的寻址方式为数据串寻址:
(1)指令中要处理的两个数据串应分别在数据段和附加段中定义。 (2)数据段中定义的数据串要用SI作指针;
汇编语言之子程序
汇编语言之子程序汇编语言是一种底层编程语言,是计算机指令的集合表示形式。
在汇编语言中,子程序是一段独立的、可重复使用的代码片段,可以在程序中被多次调用。
子程序可以帮助我们实现代码的模块化,提高代码的可读性和可维护性。
本文将介绍如何在汇编语言中使用子程序以及其工作原理。
一、子程序的定义和使用在汇编语言中,子程序由一系列指令组成,这些指令可以完成特定的功能。
子程序可以通过call指令被调用,执行完子程序后会返回到调用子程序的指令处,继续执行程序的下一条指令。
在使用子程序前,我们需要先定义子程序。
定义子程序的语法如下:```subroutine_name:; 子程序代码ret```其中,subroutine_name是子程序的名称,可以根据实际需求自定义。
ret指令用于返回到调用子程序的指令处,继续执行程序的下一条指令。
调用子程序的语法如下:```call subroutine_name```其中,subroutine_name是要调用的子程序的名称。
二、传递参数和返回值子程序可以接收参数,并且可以有返回值。
在调用子程序时,可以通过寄存器或栈来传递参数。
在子程序内部,可以通过相应的寄存器或栈地址来获取参数的值。
例如,我们定义一个计算两个数之和的子程序add:```add:mov ax, [bp+4] ; 获取第一个参数的值add ax, [bp+6] ; 获取第二个参数的值ret```在主程序中调用add子程序:```mov ax, 5 ; 第一个参数mov bx, 10 ; 第二个参数call add ; 调用add子程序; 此时ax寄存器中的值为15,即5+10的结果```在子程序add中,我们通过寻址方式获取传递的参数,并将计算结果存入ax寄存器中,供主程序使用。
三、保存和恢复寄存器在汇编语言中,调用子程序时需要保存和恢复寄存器的值,以保证程序的正确执行。
在调用子程序前,我们可以使用push指令将需要保存的寄存器值压栈,然后在子程序的开头使用相应的pop指令将值弹出并恢复。
汇编语言程序 掌握子程序的设计
汇编语言程序掌握子程序的设计汇编语言程序掌握子程序的设计什么是子程序子程序是汇编语言中一种独立的可重复使用的程序代码片段,它可以被主程序调用和执行。
子程序的设计可以让程序更加模块化,提高代码的复用性和可维护性。
子程序的设计原则1. 单一职责原则:每个子程序只负责一个特定的任务,功能要清晰明确,只有一个明确的入口和出口。
2. 低耦合原则:子程序之间应该尽量少的依赖和耦合,可以独立进行调试和修改,互相之间不会产生影响。
3. 高内聚原则:子程序内部的代码要高度集中和相关联,功能相关的代码应该放在一起。
4. 应该尽量避免代码的冗余和重复,可以将常用的代码片段封装成子程序,提高代码的可维护性和可读性。
子程序的设计步骤1. 确定子程序的功能和功能的输入输出:明确子程序的任务和需要的输入参数,确定子程序的输出结果。
2. 设计子程序的接口和入口参数:确定子程序的调用方式和输入参数的传递方式,以及子程序返回结果的方式。
3. 编写子程序代码:根据子程序的功能和接口的要求,编写相应的汇编语言代码。
4. 调试和测试子程序:进行子程序的单独测试和调试,确保子程序的功能正确和稳定。
5. 在主程序中调用子程序:将子程序集成到主程序中,并按照子程序的接口要求传递参数并获取结果。
子程序的设计案例:计算阶乘假设我们需要在汇编语言中设计一个子程序,用于计算给定整数的阶乘。
assemblysection .datanum db 5result dw 0section .textglobal _start_start:mov al, te [num]call factorialmov word [result], ax ; 其他指令factorial:push bpmov bp, sppush axpush cxxor ax, axmov cl, alcmp al, 1je end_factorialdec alcall factorialmul clend_factorial:pop cxpop axpop bpret在上面的例子中,我们使用了一个子程序`factorial`,用于计算给定整数的阶乘。
第7章子程序设计
程序如下: ; 7-5.asm 堆栈传参。实现两个矩阵的乘法c=a*b data segment a db 1,1,1,1 db 2,2,2,2 db 3,3,3,3 b db 1,1,1 db 2,2,2 db 3,3,3 db 4,4,4 m dw 3 ;A矩阵3行4列 n dw 4 ;B矩阵4行3列 p dw 0 c db 9 dup(?) ;C矩阵3行3列 data ends code segment assume cs:code,ds:data main proc far
;子程序2:查表,显示十六进制 let2: mov dx,offset mess2 ;显示提示2 mov ah,9 int 21h mov bx,x mov ch,4 mov cl,4 rept1: rol bx,cl ;0031→0310→3100→1003→0031 mov al,bl and ax,000fh ;保留最低4位 mov si,ax mov dl,hex[si] ;查表显示高位、低位 mov ah,2 out1: int 21h mov ah,4ch dec ch int 21h jnz rept1 code ends ret end start
7.2 调用和返回
CALL指令和RET指令是机器指令。调 用指令CALL与无条件转移指令JMP一 样,都是对指令指针寄存器IP作修改 后,转移到子程序执行。 有时也需要修改代码段寄存器CS的值, 作跨段调用。因此都有转移地址的寻 址方式问题。
7.2.1 调用指令CALL
格式: CALL 子程序名 功能:转移到指令指定的地址(子程序 名)去执行子程序。CALL指令必须指定 转移的目标地址。执行时,先将断点入 栈保存,再修改IP或修改IP、CS。
;子程序3,将bx中的数显示为十进制数 subr3 proc near mov ax,bx ;bx为传参寄存器 mov cx,0 mov bx,10 let1: ;将ax变为十进制数 mov dx,0 inc cx ;统计余数个数 idiv bx ;除以10,商在AX,余数在DX push dx ;保存余数 cmp ax,0 jnz let1 let2: ;循环显示余数 pop ax add ax,0030h mov dl,al mov ah,2 int 21h loop let2 ret subr3 endp ;将余数弹入ax ;调整为ASCII码
第七章 子程序设计 汇编语言课件
用户可以在过程定义时用near或far改变缺省属性。
2020/10/21
河南师范大学计算机与信息技术学院
7
汇编语言程序设计——方法、技术、应用
7.1.2 子程序的调用和返回
过程的正确执行是由子程序的正确调用和正确返回保证的。 80x86的CALL和RET指令完成的就是调用和返回的功能。 为了保证正确性:
2020/10/21
河南师范大学计算序设计——方法、技术、应用
④ 段间间接远调用
格式:CALL DST
执行的操作:
当操作数长度为16位时, PUSH (CS) PUSH (IP) (IP)←(EA) (CS)← (EA+2)
当操作数为32位时,
PUSH (CS)
上述指令格式中,并未P加US上HN(EAERIPP)TR 或 FAR PTR格式的属性操
(1)CALL调用指令
CALL指令分成4种类型(类似JMP):
CALL label
;段内调用、直接寻址
CALL r16(32)/m16(32) ;段内调用、间接寻址
CALL far ptr label ;段间调用、直接寻址
CALL far ptr mem
;段间调用、间接寻址
CALL指令需要保存返回地址:
2020/10/21
河南师范大学计算机与信息技术学院
13
汇编语言程序设计——方法、技术、应用
③ 段间直接远调用
格式:CALL DST
执行的操作: 当操作数长度为16位时, PUSH (CS) PUSH (IP) (IP)←DST指定的偏移地址 (CS)←DST指定的段地址 当操作数为32位时, PUSH (CS) PUSH (EIP) (EIP)←DST指定的偏移地址 (CS)←DST指定的段地址
汇编语言程序 掌握子程序的设计(2023版)
汇编语言程序掌握子程序的设计汇编语言程序设计——子程序的设计一、引言汇编语言是一种低级别程序设计语言,与计算机硬件之间的联系非常紧密。
掌握子程序的设计是汇编语言程序设计的重要环节之一,本文档将详细介绍汇编语言程序中子程序的设计方法。
二、子程序的概念⒈子程序的定义子程序是一段独立的代码段,用于完成特定的功能,可以被主程序或其他子程序调用。
⒉子程序的优点⑴提高程序的模块化和可读性⑵重复利用代码,减少代码冗余⑶便于程序的维护和调试三、子程序的设计⒈子程序的设计要素⑴子程序的输入参数⑵子程序的返回值⑶子程序的功能描述⒉子程序的设计步骤⑴确定子程序的功能和输入参数⑵设计子程序的算法⑶编写子程序的代码⑷调试子程序并验证其正确性四、子程序的调用与返回⒈子程序的调用⑴传递参数⑵调用子程序⑶获取返回值⒉子程序的返回⑴返回值的存储⑵返回地质的存储五、子程序的参数传递⒈参数传递的方式⑴寄存器传递参数⑵栈传递参数⑶内存传递参数⒉参数传递的注意事项⑴参数传递的顺序⑵参数传递的大小和类型⑶参数传递的规范六、子程序的返回值⒈返回值的存储方式⑴寄存器存储返回值⑵内存存储返回值⒉返回值的类型⑴整型返回值⑵实型返回值⑶字符串返回值七、附件本文档没有附件。
八、法律名词及注释⒈子程序:在计算机程序中,独立完成特定功能的代码段。
⒉模块化:将程序分成多个独立的模块,每个模块负责完成特定功能。
⒊可读性:指程序的易读程度,便于程序员理解和维护。
⒋代码冗余:程序中重复出现的代码。
⒌算法:解决问题的一系列步骤。
汇编语言程序 掌握子程序的设计
汇编语言程序掌握子程序的设计汇编语言程序:掌握子程序的设计1·简介在汇编语言程序中,子程序是一个独立的代码块,用于完成特定的任务。
子程序可以被重复利用,并且可以在主程序中被多次调用。
本文档将介绍如何设计和使用子程序。
2·子程序的定义和用途子程序是一个独立的代码块,通常以过程或函数的形式存在。
它接收输入参数,执行特定任务,并返回结果给调用者。
子程序的主要用途是提高代码的可读性和可维护性。
3·子程序的设计原则设计子程序时需要考虑以下原则:1·清晰明确:子程序的功能要清晰明确,只完成一个特定任务。
2·可重用:子程序应该被复用,避免重复编写相同的代码。
3·低耦合:子程序应该尽量与其他代码模块解耦,降低代码的依赖性。
4·高内聚:子程序内部的代码应该高度相关,完成一个独立的任务。
5·参数传递:合理选择参数的传递方式,例如传值、传址等。
6·返回结果:子程序可以返回一个或多个结果给调用者。
4·子程序的设计步骤设计一个子程序可以按照以下步骤进行:1·需求分析:明确子程序的功能和输入输出要求。
2·算法设计:设计子程序的算法,确定实现方式。
3·参数和返回值定义:确定需要传入的参数和返回的结果。
4·编写代码:根据算法设计和参数定义编写子程序的代码。
5·调试和测试:使用合适的测试数据对子程序进行调试和测试。
6·优化和扩展:根据实际情况对子程序进行优化和扩展。
5·子程序的调用方法在汇编语言中,可以使用CALL和RET指令来调用和返回子程序。
1·调用子程序:使用CALL指令将程序的控制权转移到子程序的入口处。
2·传递参数:将需要传递的参数存储在合适的寄存器或内存位置中。
3·执行子程序:子程序会执行特定的任务,并根据需要修改参数的值。
汇编语言程序 掌握子程序的设计
汇编语言程序掌握子程序的设计汇编语言程序掌握子程序的设计子程序的定义和使用,我们需要了解子程序的定义和使用。
在汇编语言中,子程序通常由一段带有入口点和出口点的代码块组成。
入口点是子程序被调用的位置,而出口点是子程序执行完毕后返回的位置。
下面是一个简单的子程序的定义示例:; 子程序的说明subroutine:; 子程序的代码逻辑ret在上面的示例中,`subroutine` 是子程序的入口点,`ret` 是子程序的出口点。
当程序执行到 `ret` 指令时,将返回到调用子程序的位置继续执行后续的代码。
调用子程序的方法是使用 `call` 指令,以指令的形式告诉处理器需要调用的子程序入口点的位置。
例如:call subroutine这将会跳转到 `subroutine` 的入口点开始执行子程序的代码,然后在子程序执行完毕后返回到 `call` 指令的下一条指令继续执行后续的代码。
子程序的设计原则设计一个高效和可重用的子程序需要遵循一些设计原则:1. 单一责任原则一个子程序应该只负责一个特定的任务或功能。
这样可以使子程序的设计更加清晰和可重用。
2. 输入和输出参数子程序应该通过参数来接收输入的数据,并将处理后的数据通过参数返回。
这样可以增加子程序的灵活性和可重用性。
3. 注释和文档为子程序添加详细的注释和文档,可以使其他程序员更容易理解和使用子程序。
注释应该清晰地描述子程序的功能、输入和输出参数以及注意事项。
4. 错误处理子程序应该具备良好的错误处理机制,它应该能够在遇到错误时返回错误码或抛出异常。
这样可以提高程序的可靠性和可维护性。
5. 可测试性设计可测试的子程序是很重要的。
你可以为每个子程序编写对应的测试用例,以确保子程序的正确性和稳定性。
子程序的优化技巧除了以上的设计原则,还有一些优化技巧可以提高子程序的性能:1. 寄存器的使用在子程序中尽可能地使用寄存器进行计算和存储临时数据,而不是使用内存。
因为寄存器的读写速度要远快于内存,可以显著提高程序的执行效率。
汇编语言子程序设计
汇编语言子程序设计汇编语言子程序设计简介汇编语言是一种低级语言,经常被用来编写底层的软件和嵌入式系统。
在汇编程序中,子程序是一种可重复使用的代码块,用于执行特定的任务。
本文将介绍汇编语言中子程序的设计和实现方法。
我们将以x86架构为例,使用NASM作为汇编器。
子程序的定义与调用子程序是一个独立的代码块,可以接受输入参数并返回结果。
在汇编语言中,子程序的定义通常由标签来表示,调用子程序时可以使用CALL指令。
子程序的定义下面是一个简单的子程序定义的示例:assemblycalculate_sum:; 子程序代码;ret在这个例子中,`calculate_sum`是子程序的标签,子程序代码写在标签后面。
`ret`指令用于返回到调用者。
子程序的调用要调用一个子程序,可以使用CALL指令,将控制权转移到子程序的入口点。
assemblycall calculate_sum在这个示例中,`calculate_sum`是要调用的子程序的标签。
子程序的输入参数子程序常常需要接受输入参数,以执行特定的任务。
在x86汇编语言中,参数可以通过寄存器或栈传递。
寄存器传递参数寄存器传递参数是一种直接将参数存储在寄存器中的方式。
x86架构提供了一些通用寄存器,可以用于传递参数。
通常,EAX、EBX、ECX和EDX寄存器被用作函数调用时的参数传递寄存器。
其他寄存器如ESI和EDI可以用作传递额外参数。
下面是一个使用寄存器传递参数的示例:assemblycalculate_sum:mov eax, [ebp+8] ; 将第一个参数存储到EAX寄存器mov ecx, [ebp+12] ; 将第二个参数存储到ECX寄存器add eax, ecx ; 将两个参数相加ret在这个示例中,我们使用EBP寄存器作为基址指针,通过偏移来访问参数。
栈传递参数栈传递参数是将参数存储在栈中,然后在子程序中使用ESP寄存器来访问这些参数。
栈是一种后进先出(LIFO)数据结构,可以方便地存储和检索参数。
汇编语言程序 掌握子程序的设计
汇编语言程序掌握子程序的设计汇编语言程序:掌握子程序的设计1. 引言编程语言是计算机与人进行交流的桥梁,而汇编语言是一种底层的编程语言,直接与计算机硬件进行交互。
掌握汇编语言的使用对于理解计算机底层原理、优化程序性能以及开发低级系统软件具有重要意义。
在编写汇编语言程序时,合理设计子程序是一项关键任务。
本文将介绍如何掌握子程序的设计,从而提高汇编语言程序的可读性、维护性和性能。
2. 什么是子程序子程序是一个独立且可重复使用的代码块,用于解决特定的任务。
在汇编语言中,子程序通常由一系列指令组成,可以接受输入参数并返回输出结果。
通过将程序分解为多个子程序,可以使代码结构更加清晰,提高代码的可读性和可维护性。
3. 子程序设计的原则在设计子程序时,应遵循以下几个原则:3.1 单一职责原则每个子程序应只负责完成一个特定的任务,避免一个子程序功能过于复杂。
这样可以提高代码的可读性和可维护性,并且方便进行单元和代码重用。
3.2 参数传递原则合理选择参数传递的方式,将必要的信息传递给子程序。
常见的参数传递方式包括将参数保存在寄存器中、使用堆栈传递参数以及通过全局变量传递参数。
根据不同的应用场景,选择合适的方式。
3.3 返回值传递原则子程序执行完成后,通常需要返回一个结果。
可以使用寄存器存储返回值,也可以通过堆栈传递返回值。
在设计子程序时,需要明确返回值的类型和传递方式。
3.4 寄存器保护原则在调用子程序时,需要注意保护寄存器中的数据。
由于子程序可能会改变寄存器的值,在调用子程序之前,需要先将关键寄存器的值保存到栈中,在子程序执行完成后再恢复。
3.5 清理堆栈原则在子程序调用期间,可能会使用堆栈来传递参数和存储临时变量。
在子程序执行完成后,需要及时清理堆栈,确保堆栈恢复到调用子程序之前的状态。
4. 子程序设计示例:计算斐波那契数列为了更好地理解子程序设计的原则,我们以计算斐波那契数列为例进行说明。
assembly; 计算斐波那契数列的子程序; 输入:ECX(求解的斐波那契数列长度); 输出:EAX(斐波那契数列的结果)CalcFibonacci PROCMOV EAX, 0 ; 前一个斐波那契数MOV EBX, 1 ; 当前斐波那契数MOV EDX, ECX ; 计数器DEC EDX ; 减去初始值1LOOP_START:ADD EAX, EBX ; 计算下一个斐波那契数XCHG EAX, EBX ; 更新数列中的前一个数和当前数LOOP LOOP_START ; 重复计算RETCalcFibonacci ENDP在这个示例中,我们设计了一个名为CalcFibonacci的子程序,用于计算斐波那契数列。
汇编语言子程序设计
汇编语言子程序设计汇编语言子程序设计一、介绍在计算机编程中,汇编语言是一种低级语言,它与机器语言非常接近。
汇编语言使用助记符来表示计算机指令,可以直接操作计算机硬件。
而子程序是一种独立的代码块,可以重复使用,实现功能模块化和代码的复用。
二、子程序的定义与声明1:定义子程序:子程序可以通过标签来定义,使用关键字PROC表示开始,使用关键字ENDP表示结束。
例如:```MySubproc PROC:::MySubproc ENDP```2:声明子程序:可以使用EXTERN关键字声明一个外部子程序,以便在代码中调用。
例如:```EXTERN MyExternalSubproc:PROC```三、子程序的参数传递1:寄存器传递:参数可以通过寄存器来传递,常用的寄存器包括AX、BX、CX、DX等。
例如:```MOV AX, 5 ; 将参数5传递给AX寄存器CALL MySubproc ; 调用子程序```2:堆栈传递:参数也可以通过堆栈来传递,使用PUSH指令将参数压入堆栈,使用POP指令将参数从堆栈中取出。
例如:```PUSH 5 ; 将参数5压入堆栈CALL MySubproc ; 调用子程序```四、子程序返回值1:使用寄存器返回值:子程序的返回值可以通过寄存器来传递,常用的寄存器包括AX、BX、CX、DX等。
例如:```MOV AX, 10 ; 子程序返回值为10,存储在AX寄存器中RET ; 返回至调用处```2:使用堆栈返回值:子程序的返回值也可以通过堆栈来传递,使用PUSH指令将返回值压入堆栈,使用RET指令返回至调用处。
例如:```PUSH 10 ; 将子程序返回值10压入堆栈RET ; 返回至调用处```五、子程序的调用1:使用CALL指令调用子程序:使用CALL指令可以调用子程序,调用子程序之前需要将参数准备好,并将返回值保存在适当的寄存器或堆栈中。
例如:```MOV AX, 5 ; 将参数5传递给AX寄存器CALL MySubproc ; 调用子程序```2:使用CALL FAR指令调用外部子程序:如果需要调用位于其他模块或库中的子程序,可以使用CALL FAR指令。
汇编语言---子程序设计
(3) 子程序调用和返回 子程序调用和返回实质上是程序控制的转移。 子程序调用和返回实质上是程序控制的转移。 子程序的调用和返回是由主程序中的CALL指令和 子程序的调用和返回是由主程序成的. 子程序中的RET指令来完成的.
其结构格式如下: 其结构格式如下: CODE SEGMENT (程序段1) 程序段1 MAIN PROC FAR 程序段) (程序段) CALL SUB1 SUB1 程序段1 (程序段1) RET MAIN ENDP SUB1 SUB1 PROC NEAR 程序段1 (程序段1) RET SUB1 SUB1 ENDP CODE ENDS
1. 子程序结构形式 一般子程序以子程序文件形式存在, 一般子程序以子程序文件形式存在 , 子程序文件 由 说明文件 子程序本身 (1) 子程序说明文件 功能描述:程序的名称、功能、性能指标; 功能描述:程序的名称、功能、性能指标; 所用的寄存器、存储单元及其说明; 所用的寄存器、存储单元及其说明; 子程序的入口、出口参数说明; 子程序的入口、出口参数说明; 子程序中又调用的其它子程序的说明。 子程序中又调用的其它子程序的说明。
子程序及过程定义
由于汇编语言所操作处理的对象主要是CPU寄存器,而主 寄存器, 由于汇编语言所操作处理的对象主要是 寄存器 程序在调用子程序时,已经占用了一定的寄存器, 程序在调用子程序时,已经占用了一定的寄存器,子程序执行时 又要使用寄存器,子程序执行完毕返回主程序后, 又要使用寄存器,子程序执行完毕返回主程序后,又要保证主程 序按原有状态继续正常执行, 序按原有状态继续正常执行,这就需要对这些寄存器的内容加以 保护,这就称为现场保护。 保护 这就称为现场保护。 这就称为现场保护 子程序执行完毕后再恢复这些被保护的寄存器的内容, 子程序执行完毕后再恢复这些被保护的寄存器的内容,称为 现场恢复。 现场恢复。
汇编子程序设计
汇编子程序设计第一点:汇编子程序设计的重要性汇编子程序设计是计算机科学领域中一种重要的编程技术。
汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。
通过汇编子程序设计,程序员可以更直接地控制计算机硬件,提高程序的运行效率和性能。
汇编子程序设计的重要性体现在以下几个方面:1.更高效的资源利用:汇编语言能够充分利用计算机的硬件资源,如CPU的寄存器和指令集。
通过直接操作硬件,程序员可以编写出运行效率更高的代码,尤其是在对性能要求极高的应用中,如操作系统、驱动程序和游戏引擎等。
2.深入理解计算机工作原理:学习汇编子程序设计有助于程序员深入理解计算机的工作原理。
通过直接编写与硬件相关的代码,程序员可以更好地理解CPU的架构、内存管理、指令执行过程等底层细节。
3.优化程序性能:汇编子程序设计允许程序员手动优化程序性能。
通过对代码进行精细调整,程序员可以减少程序的运行时间和资源消耗,提高用户体验。
4.兼容性和可移植性:尽管汇编语言与特定的硬件平台紧密相关,但在某些情况下,通过汇编子程序设计可以实现更好的跨平台兼容性和可移植性。
例如,某些重要的系统级功能可以通过汇编语言实现,然后在不同的硬件平台上进行适配和优化。
第二点:汇编子程序设计的挑战与解决方法尽管汇编子程序设计具有很多优势,但也面临着一些挑战。
以下是汇编子程序设计中常见的一些挑战以及相应的解决方法。
1.编程复杂性:汇编语言的语法和结构比高级编程语言更为复杂。
程序员需要熟悉计算机的硬件架构和指令集,才能编写出正确的汇编代码。
为了解决这个问题,程序员可以借助一些工具和资源,如汇编器的文档、在线教程和示例代码等,来提高自己的汇编编程能力。
2.代码可读性和可维护性:由于汇编语言的低级性和复杂性,编写出的代码往往难以阅读和维护。
为了解决这个问题,程序员可以采用一些最佳实践,如编写清晰的注释、使用适当的命名约定和模块化设计等,来提高代码的可读性和可维护性。
3.调试和错误检测:汇编语言的调试过程通常比较困难,因为错误可能出现在代码的任何一个细节上。
汇编语言子程序设计
;返回程序
7.3.2子程序的调用与返回
调用子程序指令:CALL
第7章 子程序设计
汇 编 语 言 程 序 设 计
返回主程序指令:RET
【例7-2】以下程序用于计算=m!/(n!*(m-n)!)的值(m、n为自然数,且m>n)。 (假设阶乘乘积大小不超过两个字节)
开始 N送CX SUB1子程序开始 1送AX AX*CX送AX CX—1送AX N CX=0 Y 返回 调用SUB1子程序 AX(即n!)送BX M送CX
调用SUB1子程序
AX/BX(即m!/n!)送BX
m—n送CX
调用SUB1子程序 AX(即(m—n)!)送BX AX/BX(即m!/n!/ (m—n)!)送AX
存储AX 结束
第7章 子程序设计
DATA SEGMENT M EQU 8 N EQU 3 RES DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,N CALL SUB1 ;调子程序计算n! MOV BX,AX MOV CX,M CALL SUB1 ;调子程序计算m! DIV BX ;m!/n!送 AX MOV BX,AX MOV CX,M SUB CX,N CALL SUB1 ;调用子程序,计算(m-n)! XCHG BX,AX DIV BX ;m!/n!/ (m-n)! 送AX MOV RES,AX MOV AH,4CH INT 21H SUB1 PROC ;计算阶乘的子程序 MOV AX,1 NEXT:MUL AX,CX LOOP NEXT RET SUB1 ENDP CODE ENDS END START
[BX]=AX,SI=SI=2,DI=DI+2 BX=BX+2,CX=CX-1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章子程序设计返回目录练习题7.4.1 单项选择题1.在子程序中,如果利用堆栈保护现场,在恢复现场时,先压入堆栈的内容()。
A.先弹出堆栈 B.后弹出堆栈 C.不分先后弹出堆栈 D.任意弹出堆栈2.下列叙述不正确的是()。
A.在子程序中的现场保护只能用堆栈来实现。
B.在子程序中的现场保护用堆栈来实现是其中的一种方法。
C.在子程序中的现场保护可以有多种实现方法。
D.在子程序中的现场保护可以将要保护的内容送内存变量来实现。
3.下列定义子程序的是()。
A. PNAME PROC B. PNAME PROC……PNAME ENDS ENDMC. PNAME PROC D. PNAME PROC……PNAME ENDP PNAME END4.子程序重定位可选在内存中的整个区域内,在进行程序设计时,子程序应采用()。
A.绝对地址 B.相对地址 C.逻辑地址D.物理地址5.下列叙述不正确的是()。
A.在子程序中可以再次调用子程序。
B.在主程序中一般用跳转指令转移到子程序。
C.在子程序中一般用返回指令返回到主程序。
D.在主程序中一般用调用指令转移到子程序。
6.下列叙述正确的是()。
A.执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP指针减2。
B.执行一条段内返回指令,先SP指针减2,然后从堆栈弹出两个字节的内容。
C.执行一条段内返回指令,先SP指针加2,然后从堆栈弹出两个字节的内容。
D.执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP指针加2。
7.下列叙述正确的是()。
A.执行一条段间调用指令,先将CS、IP的内容压栈,然后将目的地址送CS和IP。
B.执行一条段间调用指令,先将目的地址送CS和IP,然后将CS、IP的内容压栈。
C.执行一条段间调用指令,先将CS、IP的内容压栈,然后SP指针加2。
D.执行一条段间调用指令,先将CS、IP的内容压栈,然后SP指针减2。
8.下列叙述不正确的是()。
A.在汇编语言程序中,每一个过程允许有多条RET 指令。
B.在汇编语言程序中,每一个过程只允许出现一条RET指令。
C.在汇编语言程序中,每一个过程结束之前一定有一条RET指令。
D.在汇编语言程序中,以过程形式表示的代码段一定有一条RET指令存在。
9.下列叙述中属于子程序嵌套的是()。
A.主程序调用子程序1B.主程序调用子程序2C.主程序调用子程序3D.子程序1调用子程序210.下列叙述中属于子程序直接递归调用的是()。
A.子程序1调用子程序2B.子程序2调用子程序3C.子程序3调用子程序4D.子程序4调用子程序411.在进行DOS功能调用前,其功能号应先送()。
A.AH寄存器 B.BH寄存器 C.CH寄存器D.DH寄存器12.执行“INT 10H”指令时,中断向量地址是()。
A.10H B.20H C.30H D.40H13.执行“INT 10H”指令时,其中断处理程序的入口地址存放在()。
A.10H~13H B.20H~23H C.30H~33H D.40H~43H14.执行“INT 10H”指令时,压入堆栈的内容有()。
A.PSW、CS、IP B.CS、IP C.PSW、IP D.PSW、CS15.在进行字符串显示的DOS功能调用时,要求字符串的最后一个字符是()。
A.0 B.‘0’ C.‘$’ D.0DH7.4.2 多项选择题1.一般的子程序说明文件有()。
A.子程序名 B.功能描述 C.入口参数 D.出口参数2.在子程序的设计中,通常采用现场保护和现场恢复的方法有()。
A.寄存器法 B.堆栈法 C.约定单元法 D.变元法3.子程序的参数传递方法有()。
A.寄存器法 B.约定单元法 C.堆栈法D.变元法4.下列叙述中属于子程序嵌套的有()。
A.子程序1调用子程序2,子程序2调用子程序3。
B.主程序调用子程序2。
C.主程序调用子程序3。
D.子程序3调用子程序4。
5.下列叙述中属于子程序递归调用的有()。
A.子程序1调用子程序2,子程序2调用子程序3。
B.子程序2调用子程序3,子程序3调用子程序2。
C.子程序3调用子程序4,子程序4调用子程序3。
D.子程序3调用子程序3。
6.在执行“CALL FAR PTR M”指令后,完成的操作有()。
A.CS、IP入栈 B.SP+2 C.SP+4 D.目的地址送CS、IP7.下列叙述正确的有()。
A.如果主程序和子程序A在同一代码段,则用“CALL A”可以实现子程序的调用。
B.如果主程序和子程序A不在同一代码段,则用“CALL A”可实现子程序的调用。
C.如果主程序和子程序A在同一代码段,则用“CALL FAR PTR A”可以实现子程序的调用。
D.如果主程序和子程序A不在同一代码段,则用“CALL FAR PTR A”可以实现子程序的调用。
8.下列叙述不正确的有()。
A.在子程序设计中,不论采用什么参数传递方法,须将所有寄存器的内容保护起来。
B.在子程序设计中,为了防止寄存器内容被破坏,通常将有关寄存器内容保护起来。
C.在子程序设计中,都是采用寄存器法传递参数。
D.在子程序设计中,子程序都只安排一个出口。
9.在进行字符串输入的DOS功能调用时,输入字符串缓冲区中的内容是()。
A.第一单元存放字符个数。
B.第二单元存放的是实际输入字符的个数。
C.第三单元开始存放输入字符的ASCII码。
D.最后一个单元存放回车符。
10.如果要将BUF字符缓冲区的内容显示输出,在采用DOS 功能调用前,必须()。
A.将BUF字符缓冲区的段地址送DS。
B.将BUF字符缓冲区的段地址送ES。
C.将BUF字符缓冲区的偏移地址送DX。
D.将功能号9送AH寄存器。
7.4.3 填空题1.调用子程序通常用指令,返回调用程序通常用指令。
2.在子程序的设计中,通常用堆栈来保护现场和恢复现场。
而堆栈的操作原则是。
3.如果主程序和子程序在同一个代码段,则主程序调用子程序时只改变地址。
如果主程序和子程序不在同一个代码段,则主程序调用子程序时要改变地址。
4.在调用程序中调用子程序的CALL指令执行后,压人堆栈的内容是指令的下一条指令的地址。
在子程序中的RET指令将返回指令继续执行程序。
5.子程序(过程)的定义是以“过程名”开始,以“过程名”结束。
6.在调用子程序前,如果将要参加运算的数送寄存器,这种参数传递方法称为;如果将要参加运算的数送指定的内存单元,这种参数传递方法称为;如果将要参加运算的数压入堆栈,这种参数传递方法称为。
7.一个子程序调用另一个子程序称为;一个子程序直接或间接调用该子程序本身称为。
8.以过程定义的子程序有两种类型的属性,他们分别是和。
9.在程序设计中,利用堆栈不仅可以保存,而且还可以保存主程序和子程序之间传递的参数,这些参数既可以是,也可以是。
10.在程序的执行过程中,近程调用时CALL指令执行完后压入堆栈的内容是字节,远程调用时CALL指令执行完后压入堆栈的内容是字节。
11.在编制子程序时,的使用是十分频繁的,它不仅可以用来保存返回的地址,而且还可以用来存放主程序与子程序之间传递的。
12.子程序的正确执行是由主程序中的指令和子程序的指令来完成的。
13.在进行“INT 45H”功能调用时,其中断类型号为,调用的功能号应送。
14.DOS系统功能调用是根据中断类型号从中断向量表中取中断处理程序的入口地址。
每一个中断处理程序的入口地址占用内存字节,其中的低地址字用来存放中断处理程序的,高地址字用来存放中断处理程序的。
15.中断向量表占用内存字节,它的物理地址范围是。
16.在DOS系统功能调用中,01号功能调用表示,它的出口参数在中。
02号功能调用表示,它的入口参数在中。
17.在DOS系统功能调用中,要实现字符串显示输出应使用号功能调用,要实现字符串输入应使用号功能调用。
18.在进行字符串输入的DOS系统功能时,如果键盘输入字符“345A”后按回车键,则在键盘输入缓冲区的第二单元的值是,在第三到第七单元的值依次是。
19.在进行字符串显示输出的DOS系统功能时,要求输出字符串以结尾。
20.在进行DOS功能调用时,压入堆栈的内容是。
7.4.4 简答题1.简述在程序设计中,采用子程序结构有哪些优点?2.简述过程的定义与子程序的定义有何区别?3.简述一个完整的子程序结构应包含哪几方面的内容?4.在子程序的设计过程中,子程序的现场保护和现场恢复通常采用哪几种方法?哪一种方法使用较为方便?5.调用程序和子程序之间一般使用哪几种参数的传递方法?他们各自的特点是什么?6.简述段内调用和段间调用时堆栈有何不同?7.简述子程序嵌套调用的基本原理。
8.简述递归调用的基本原理。
9.简述DOS系统功能调用的使用方法。
10.简述DOS系统功能调用和中断返回时堆栈的变化?7.4.5 程序分析题1.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTBUF DB 100 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXLEA DI,BUFL: MOV AH,1INT 21HCMP AL,0DHJZ EXITCALL STOJMP LEXIT: MOV BYTE PTR[DI],‘$’LEA DX,BUFMOV AH,9INT 21HMOV AH,4CHINT 21HSTO PROCCMP AL,30HJB NEXTCMP AL,39HJA NEXTMOV [DI],ALINC DINEXT: RETSTO ENDPCODE ENDSEND START请回答:(1)STO子程序完成的功能是什么?(2)该程序完成的功能是什么?2.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTBUF 1 DB 100 DUP(?)BUF2 DB 200,0,200 DUP(0)EQ DB ‘两个字符串相等!$’NEQ DB ‘两个字符串不相等!$’FLAG DB 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV EX,AXMOV AX,STACKMOV SS,AXLEA DX,BUF2MOV AH,0AHINT 21HMOV CX,100LEA SI,BUF1LEA DI,BUF2+2CALL SCMPCMP FLAG,0JZ NLEA DX,EQMOV AH,9INT 21HJMP EXITN: LEA DX,NEQMOV AH,9INT 21HEXIT: MOV AH,4CHINT 21HSCMP PROCPUSH AXMOV AH,[DI-1]MOV AL,9MOV AH,0CMP AX,CXJZ RCLDCMPSBJNZ RMOV FLAG,0FFHJMP R1R: MOV FLAG,0 R1: POP AXRETSCMP ENDPCODE ENDSEND START请回答:(1)SCMP子程序完成的功能是什么?(2)该程序完成的功能是什么? 3.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTBUF DB 20C DB 4DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV BL,CMOV SI,BUFL1: PUSH SICALL SUBP1CALL SUBP2POP SIINC SIDEC BLJNZ L1MOV AH,4CHINT 21HSUBP1 PROCPUSH AXPUSH DXL2: MOV DL,20HMOV AH,2INT 21HDEC SIJNZ L2POP DXPOP AXRETSUBP1 ENDPSUBP2 PROCPUSH AXPUSH DXMOV CX,8L3: MOV DL,‘*’MOV AH,2INT 21HLOOP L3MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETSUBP2 ENDPCODE ENDSEND START请回答:(1)SUBP1子程序完成的功能是什么?(2)SUBP2子程序完成的功能是什么?(3)该程序完成的功能是什么?4.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTA DB 30B DB 9C DW 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV CX,CMOV BH,BMOV BL,AL1: PUSH BXCALL SUBP1CALL SUBP2POP BXINC BLSUB BH,2LOOP L1MOV AH,4CHINT 21HSUBP1 PROCPUSH AXPUSH DXL2: MOV DL,20HMOV AH,2INT 21HDEC BLJNZ L2POP DXPOP AXRETSUBP1 ENDPSUBP2 PROCPUSH AXPUSH DXL3: MOV DL,‘*’MOV AH,2INT 21HDEC BHJNZ L3MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETSUBP2 ENDPCODE ENDSEND START请回答:(1)SUBP1子程序完成的功能是什么?(2)SUBP2子程序完成的功能是什么?(3)该程序完成的功能是什么?5.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP (0)STACK ENDSDATA SEGMENTBUF1 DB 0E5H,01H,73H,34H,3AH,0D5HC1 = $-BUF1BUF2 DB 22H,12H,67H,35H,73H,0B3HC2 DB $-BUF2 DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXLEA BX,BUF1MOV CX,C1CALL SORTLEA BX,BUF2MOV CX,C2CALL SORTMOV AH,4CHINT 21HSORT PROCPUSH AXPUSH DXPUSH SIPUSH DIMOV DX,CXDEC DXMOV SI,1L1: MOV DI,SIINC DIMOV AL,[BX+SI-1]L2: CMP AL,[BX+DI-1] JBE NEXTXCHG [BX+DI-1],ALMOV [BX+SI-1],ALNEXT: INC DICMP DI,CXJBE L2INC SICMP SI,DXJBE L1POP DIPOP SIPOP DXPOP AXRETSORT ENDPCODE ENDSEND START请回答:(1)该子程序完成的功能是什么?(2)程序执行完后,BUF1和BUF2的内容各是什么?6.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP (0)STACK ENDSDATA SEGMENTBUF DW 20E5H,4501H,7653H,1234H,354AH,60D5HC = ($-BUF)/2SMAX DW 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AX LEA AX,BUFPUSH AXMOV AX,CPUSH AXCALL MAXMOV AH,4CHINT 21HMAX PROCPUSH BPMOV BP,SPPUSH SIPUSH AXPUSH BXPUSH CXPUSHFMOV SI,[BP+6]MOV CX,[BP+4]MOV BX,[SI]DEC CXADD SI,2CLDMAX1: LODSWCMP AX,BXJNA NEXTXCHG AX,BXNEXT: LOOP MAX1MOV SMAX,BXPOPFPOP CXPOP BXPOP AXPOP SIPOP BPRET 4MAX ENDPCODE ENDSEND START请回答:(1)该子程序完成的功能是什么?(2)程序执行完后,SMAX中的内容为何值?7.现有程序如下:STACK SEGMENT STACKDB 100 DUP(0)STACK ENDSDATA SEGMENTBUF DW 1064HN = ($-BUF)/2STR DB 9 DUP(‘ ’) DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXLEA SI,BUFMOV CX,NL: MOV AX,[SI]LEA DI,STRCALL CBDADD SI,2LOOP LMOV AH,4CHINT 21HCBD PROCPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIPUSH DIOR AX,AXJNS PLUSMOV BYTE PTR [DI],‘-’ INC DINEG AXPLUS: MOV CX,5MOV BX,10L1: MOV DX,0DIV BXADD DL,30HMOV [DI],DLINC DIOR AX,AXJZ L2LOOP L1L2: MOV BYTE PTR[DI],0DH INC DIMOV BYTE PTR[DI],0AHINC DIMOV BYTE PTR[DI],‘$’POP DXMOV AH,9INT 21HPOP DIPOP DXPOP CXPOP BXPOP AXRETCBD ENDPCODE ENDSEND START 请回答:(1)该子程序完成的功能是什么?(2)程序执行完后,显示输出的结果是什么?8.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTNUM1 DQ 7654321089ABCDEFHNUM2 DQ 0FEDCBA9801234567HRESUL DT 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SI,NUM1LEA BX,NUM2LEA DI,RESULCALL ADMOV AH,4CHINT 21HAD PROCPUSH AXPUSH CXPUSHFCLCCLDMOV CX,4AGAIN:LODSWADC AX,[BX]STOSWADD BX,2LOOP AGAINMOV AX,0ADC AX,0MOV [DI],AXPOPFPOP CXPOP AXRETAD ENDPCODE ENDSEND START请回答:(1)该子程序完成的功能是什么?(2)程序执行完后,RESUL单元的内容是什么?9.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTSTR DB ‘PLEASE INPUT STRING(0…9):$’ASC DB 20,0,20 DUP(0)BCDB DB 20 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXLEA DX,STRMOV AH,9INT 21HLEA DX,ASCMOV AH,10INT 21HLEA BX,ASC+2MOV CL,[BX-1]MOV CH,0LEA SI,BCDBCALL TABMOV AH,4CHINT 21HTAB PROCPUSH AXADD BX,CXL: DEC BXMOV AL,[BX]AND AL,0FHMOV [SI],ALINC SILOOP LPOP AXRETTAB ENDPCODE ENDSEND START请回答:(1)该子程序完成的功能是什么?(2)该程序完成的功能是什么?10.现有程序如下:STACK SEGMENT STACK ‘STACK’DW 100 DUP(0)STACK ENDSDATA SEGMENTBUF DW 8376H,9028H,4AB4H,0947H,3362HN = ($-BUF)/2STR DB 7 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXLEA SI,BUFMOV CX,NLA: MOV AX,[SI]CALL F2T10MOV DL,‘/’MOV AH,2INT 21HADD SI,2LOOP LAMOV AH,4CHINT 21HF2T10 PROCPUSH BXPUSH DXPUSH SILEA SI,STROR AX,AXJNS PLUSNEG AXMOV [SI],BYTE PTR‘-’INC SIPLUS: MOV BX,10CALL BCPMOV [SI],BYTE PTR‘$’LEA DX,STRMOV AH,9INT 21HPOP SIPOP DXPOP BXRETF2T10 ENDPBCP PROCPUSH AXPUSH BXPUSH CXPUSH SIMOV CX,0L1: MOV DX,0DIV BXPUSH DXINC CXOR AX,AXJNZ L1L2: POP AXCMP AL,10JB L3ADD AL,7L3: ADD AL,30HMOV [SI],AL INC SILOOP L2MOV [SI+1],0DHMOV [SI+2],0AHPOP SIPOP CXPOP BXPOP AXRETBCP ENDPCODE ENDSEND START请回答:(1)F2T10子程序完成的功能是什么?(2)BCP子程序完成的功能是什么?7.4.6 程序填空题1.下列程序是将BUF1缓冲区的100个字单元的内容送BUF2字缓冲区的子程序。