




已阅读5页,还剩93页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言课件11 子程序设计,子程序设计,子程序是功能相对独立并具有一定通用性的程序段,有时还将它作为一个独立的模块供多个程序使用。将常用功能编成通用的子程序是一个经常采用的程序设计方法。这种方法不仅可以简化主程序、实现模块化;还可以重复利用已有的子程序,提高编程效率。 子程序需要调用才能被执行,所以也被称为“被调用程序”;与之相对应,使用子程序的程序就是主程序,也称为“调用程序”。,在汇编语言中,子程序(subroutine)要用过程(procedure)伪指令定义。 过程声明由一对过程伪指令proc和endp完成,格式如下: 过程名 proc near|far ;过程体 过程名 endp,过程名为符合语法的标识符,每个子程序应该具有一个唯一的子程序名。可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性。 对简化段定义格式,在微型、小型和紧凑存储模式下,过程的默认属性为 near;在中型、大型和巨型存储模式下,过程的默认属性为 far。 对完整段定义格式,过程的默认属性为near,子程序调用与返回指令,当经常需要执行一段特定功能的指令序列时,就可以把它编写成一个子程序。当主程序(调用程序)需要执行这个功能时,用 call指令调用该子程序(被调用程序);于是,程序转移到这个子程序的起始处执行。在子程序最后,用ret指令返回调用它的主程序,继续执行后续指令。 call和ret指令均不影响标志位。,1. 子程序调用指令call,call指令可以分成4种情况(类似无条件转移jmp指令): 相对寻址的段内调用call指令,需要将ip压入堆栈,然后转移 call label ;ip入栈:spsp2,ss:spip ;实现转移:ipip16位位移量,间接寻址的段内调用 call指令,需要将ip压入堆栈,然后转移 call r16/m16 ; ip入栈:spsp2,ss:spip ;实现转移:ipr16/m16 直接寻址的段间调用 call指令,需要将cs和ip压入堆栈,然后转移 call far ptr label ; cs入栈:spsp2,ss:spcs ; ip入栈:spsp2,ss:spip ;实现转移:iplabel偏移地址,cslabel 段地址,间接寻址的段间调用 call指令,需要将cs和ip压入堆栈,然后转移 call far ptr mem ; cs入栈:spsp2,ss:spcs ; ip入栈: psp2,ss:spip ;实现转移:ipmem,csmem2,2. 子程序返回指令ret,ret指令用在子程序中,实现子程序的返回。根据返回范围和有无参数, ret指令也有4种情况: ret ;无参数、段内返回。 弹出ip: ipss : sp,spsp2 ret i16 ;有参数、段内返回。弹出ip: ipss : sp,spsp2 ;调整指针:spspi16,ret(retf) ;无参数、段间返回。 弹出i p:ipss : sp,spsp2 弹出cs:csss: sp,spsp2 ret i16 (retf i16 ) ;有参数段间返回: 弹出 ip: ipss:sp,spsp2 弹出cs:csss:sp,spsp2 调整指针:sp spi16,例,编写一个子程序,将ax的数据(无符号)变为十进制并显示,.model small .data a1 dw 456 .code .startup mov cx,0 mov ax,a1 mov bx,10 ag: mov dx,0 div bx add dl,0 push dx inc cx cmp ax,0 jnz ag ag1:pop dx mov ah,2 int 21h loop ag1 .exit 0 end,;入口:ax中的2进制无符号数 ; 以十进制显示 ;不保留bx,dx,cx,ax值 change proc mov cx,0 mov bx,10 ag: mov dx,0 div bx add dl,0 push dx inc cx cmp ax,0 jnz ag ag1:pop dx mov ah,2 int 21h loop ag1 ret change endp,;入口:ax中的2进制无符号数 ; 以十进制显示 change proc push ax push bx push cx push dx mov cx,0 mov bx,10 ag: mov dx,0 div bx add dl,0 push dx inc cx cmp ax,0 jnz ag ag1:pop dx mov ah,2 int 21h loop ag1,pop dx pop cx pop bx pop ax ret endp,子程序设计需要留意几个问题:,(1) 子程序要利用过程定义伪指令声明,获得子程序名和调用属性。 (2) 子程序最后利用ret指令返回主程序,主程序执行call指令调用子程序。 (3) 子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡。 (4) 子程序开始应该保护用到的寄存器内容,子程序返回前进行相应恢复。,(5) 子程序允许嵌套和递归 子程序内包含有子程序的调用,这就是子程序嵌套。嵌套深度(层次)在逻辑上没有限制,但受限于开设的堆栈空间 当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序。递归子程序的设计有一定难度,但往往能设计出效率较高的程序。,(6) 子程序可以与主程序共用一个数据段,也可以使用不同的数据段(注意修改ds)。如果子程序使用的数据或变量不需要与其它程序共享,可以在子程序最后设置数据区、定义局部变量。此时,子程序应该采用cs寻址这些数据。,例 将al低4位表达的一位16进制数转换为ascii码,htoasc proc push bx mov bx,offset ascii ; bx指向ascii码表 and al,0fh ;取得一位16进制数 xlat cs:ascii ;换码:alcs:bxal,注意数据在代码段cs pop bx ret ascii db 0,1,2,3,4,5,6,7,8,9 db a,b,c,d,e,f htoasc endp,(7) 子程序的编写可以很灵活,例如具有多个出口(多个ret指令)和入口,但一定要保证堆栈操作的正确性。,例:将一位16进制数转换成ascii码的子程序可以改写为: htoasc proc ;将al低4位表达的一位16进制数转换为ascii码 and al,0fh cmp al,9 jbe htoasc1 add al,37h ;是0ah0fh,加37h转换为ascii码 ret ;子程序返回 htoasc1:add al,0 ;是09,加30h转换为ascii码 ret ;子程序返回 htoasc endp,(8) 处理好子程序与主程序间的参数传递问题。 汇编语言中参数传递可通过寄存器、变量或堆栈来实现,参数的具体内容可以是数据本身(传数值)也可以是数据的存储地址(传地址)。 (9) 提供必要的子程序说明信息。,1 用寄存器传递参数,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址 注意,带有出口参数的寄存器不能保护和恢复,带有入口参数的寄存器可以保护也可以不保护,但最好能够保持一致。 dos功能调用都采用寄存器传递参数,例如2号和9号dos功能调用。,例:显示一批内存数据,.model small .data array dw 456,190ch ,512,766,890 count = ($-array)/2 .code .startup mov cx,count mov bx,offset array l1: mov ax,bx call change mov dl, mov ah,2 int 21h add bx,2 loop l1 .exit 0,change proc push ax push bx push cx push dx mov cx,0 a0: mov bx,10 ag: mov dx,0 div bx add dl,0 push dx inc cx cmp ax,0 jnz ag ag1: pop dx mov ah,2 int 21h loop ag1 pop dx pop cx pop bx pop ax ret change endp end,例 从键盘输入有符号10进制数的子程序,子程序从键盘输入一个有符号10进制数。负数用“”引导,正数直接输入或用“”引导。 子程序还包含将 ascii码转换为二进制数的过程,其算法如下: (1) 首先判断输入正数还是负数,并用一个寄存器记录下来; (2) 接着输入09数字(ascii码),并减0转换为二进制数;,(3) 然后将前面输入的数值乘10,并与刚输入的数字相加得到新的数值; (4) 重复(2)、(3)步,直到输入一个非数字字符结束; (5) 如果是负数则进行求补,转换成补码;否则直接将数值保存。 本例采用16位寄存器表达结果数值,所以输入的数据范围是3276732768,但该算法适合更大范围的数据输入。 子程序的出口参数用寄存器ax传递。主程序调用该子程序输入10个数据。,.model small .data count = 10 array dw count dup(0) ;可以容纳count个数据的缓冲区array定义 .code .startup mov cx,count mov bx,offset array again: call read ;调用子程序,输入一个数据 mov bx,ax ;将出口参数存放到数据缓冲区 inc bx inc bx call dpcrlf ;调用子程序,光标回车换行以便输入下一个数据 loop again .exit 0,dispchar macro char ;宏定义,显示一个字符 mov ah,2 mov dl,char int 21h endm dpcrlf proc ;使光标回车换行的子程序 push ax push dx dispchar 0dh dispchar 0ah pop dx pop ax ret dpcrlf endp,;功能:输入有符号10进制数的通用子程序 ; 出口参数:ax补码表示的二进制数值 ; 负数用“”引导,数据范围是32767到-32768 read proc push bx push cx push dx ;保护过程中将使用的寄存器 xor bx,bx ;bx保存结果 xor cx,cx ;cx为正负标志 mov ah,1 ;输入一个字符 int 21h cmp al,+ jz read1 ;是“,继续输入字符 cmp al,- jnz read2 ;是“,设置1标志 mov cx,-1 read1: mov ah,1 ;继续输入字符 int 21h read2: cmp al,0 jb read3 cmp al,9 ja read3 ;不在0-9之间,输入数据结束,sub al,0 ;是0-9之间的字符,则转换为二进制数 shl bx,1 mov dx,bx shl bx,1 shl bx,1 add bx,dx mov ah,0 add bx,ax ;已输入数值乘10后,与新输入数值相加 jmp read1 ;继续输入字符 read3: cmp cx,0 jz read4 ;是负数,进行求补 neg bx ;bx中是处理过的数据, read4: mov ax,bx ;设置出口参数 pop dx pop cx pop bx ret ;子程序返回 read endp end,2 利用参数表传递参数,例4-30 选出一个数组中最大的绝对值及其下标 .model small .data array dw 12,234,45,-23,67,789,-2456 count equ ($-array)/2 ;数组中元素个数 max dw ? index db ? tab dw ?,?,max,index ;参数表tab,给出了数组地址,个数,.model small .data array dw 12,234,45,-23,67,789,-2456 count equ ($-array)/2 ;数组中元素个数 max dw ? index db ? tab dw ?,?,max,index,.model small .code .startup mov tab,offset array ;填表开始地址 mov tab+2,count ;填表元素个数 mov bx,offset tab ;参数表地址给bx,传递给seek_max过程 call seek_max .exit 0,seek_max proc push ax push cx push si push di ;保护通用寄存器 mov dh,1 ;待处理数据序号 mov dl,0 ;当前最大的序号是0,由dl指出 mov si,bx ;取表地址 mov cx,bx+2 ;取处理的元素个数 dec cx ;待处理元素个数减1,作为循环次数 lodsw ;取表第一个数据,si-ax,si+2-si cmp ax,0 jns plus_num0 neg ax ;数据转换成其绝对值, ;此时绝对值最大的数记录在ax中 ;位置记在dl中,plus_num0: mov di,si cmp di,0 jns plus_num1 neg di ; 取后续数到di寄存器并转换成绝对值 plus_num1: cmp ax,di ;该数据比原来小转 next,否则用新的大数据 jge next mov ax,di 代替原ax中数据 mov dl,dh next: inc dh ;下个要处理的数据序号 inc si inc si ;si移动到下个数据位置 loop plus_num0,mov di,bx+4 ;取max地址 mov si,bx+6 ;取index地址 mov byte ptr si,dl ;存数据位置序号 mov di,ax ;存数据 pop di pop si pop cx pop ax ;恢复使用的寄存器 ret seek_mak endp end,3 用堆栈传递参数,参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。采用堆栈传递参数是编译程序处理参数传递以及汇编语言与高级语言混合编程时的常规方法。,例 计算无符号数平均值的子程序 子程序的入口参数利用堆栈传递,主程序需要压入数据个数和数据缓冲区的偏移地址。子程序通过bp寄存器从堆栈段相应位置取出参数(非栈顶数据),子程序的出口参数用寄存器 ax传递。主程序提供10个数据,并保存平均值。 (不考虑数据溢出),.model small .data array dw 1234, 234,34,1, 12, 767,68,678,78,900 count equ ($-array)/2 wmed dw ? ;存放平均值 .code .startup mov ax,count push ax ;压入数据个数 mov ax,offset array push ax ;压入数据缓冲区的偏移地址 call mean ;调用子程序,求平均值 ;add sp,4 ;平衡堆栈 mov wmed,ax ;保存结果(未保留余数部分) .exit 0,;计算16位无符号数平均值子程序:mean ;入口参数:顺序压入数据个数和数据缓冲区偏移地址 ;出口参数:ax平均值 mean proc push bp mov bp,sp push bx ;保护通用寄存器 push cx push dx mov bx,bp+4 ;从堆栈中取出缓冲区偏移地址bx mov cx,bp+6 ;从堆栈中数据个数cx xor ax,ax ;ax保存求和的值,mean1: add ax,bx ;求和 inc bx ;指向下一个数据 inc bx loop mean1 ;循环 mov cx,bp+6 ;数据个数在cx xor dx,dx div cx ; 除法,求的平均值在ax中(余数在dx中) pop dx ;恢复寄存器 pop cx pop bx pop bp ret 4 mean endp end,返回地址,表首地址,数据个数,bp,bx,cx,dx,例4-31 选出一个数组元素中,最大的绝对值及其下标,使用堆栈传递参数 .model small .data array dw 12,234,45,-23,67,789,-2456 count equ ($-array)/2 ;数组中元素个数 max dw ? index db ? .startup sub sp,4 mov bx, count push bx mov bx, offset arrray push bx call seek_max pop max pop ax mov index,al .exit 0,seek_max要返回最大的绝对值,位置两个数,通过栈来完成,栈顶,.code .startup sub sp,4 mov bx, count push bx mov bx, offset arrray push bx call seek_max pop max pop ax mov index,al .exit 0,seek_max要返回最大的绝对值,位置两个数,通过栈来完成,?,栈顶,?,sub sp,4后, 预留了两个位置 结果,.code .startup sub sp,4 mov bx, count push bx mov bx, offset arrray push bx call seek_max pop max pop ax mov index,al .exit 0,seek_max要返回最大的绝对值,位置两个数,通过栈来完成,seek_max proc push bp mov bp,sp push ax push bx push cx push dx push si push di mov si,bp+4 mov cx,bp+6 mov dh,1 mov dl,0 dec cx lodsw,cmp ax,0 jns plus_num0 neg ax plus_num0: mov di,si cmp di,0 jns plus_num1 neg di plus_num1: cmp ax,di jge next mov ax,di mov dl,dh next: inc dh inc si inc si loop plus_num0,mov bp+8, ax ;最大值入栈 mov bp+10, dx ;最大值位置序号入栈 pop di pop si pop dx pop cx pop bx pop bp ret 4 seek_mak endp end,子程序的递归调用,子程序自己调用自己称为递归调用 直接递归调用 间接递归调用 关键技术 利用堆栈传递参数,例 利用递归方法计算一个数的阶乘n!,.model small .data n dw 3 fac dw ? .code .startup mov ax,n push ax call fact pop ax mov fac,ax call change .exit 0,n,sp,调用fact过程前n进栈,fact的结果n!也放在该地方,通过pop指令得到结果。,;入口:ax中的2进制无符号数 ; 以十进制显示 change proc push ax push bx push cx push dx mov cx,0 mov bx,10 ag: mov dx,0 div bx add dl,0 push dx inc cx cmp ax,0 jnz ag ag1:pop dx mov ah,2 int 21h loop ag1,pop dx pop cx pop bx pop ax ret endp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6,exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6,exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,注意: 乘的积为32位,在dx:ax中。,例 利用递归方法计算3!阶乘的执行过程,3,sp,.model small .data n dw 3 fac dw ? .code .startup mov ax,n push ax call fact pop ax mov fac,ax call change .exit 0,6,sp,例 利用递归方法计算3!的阶乘,a点位置,ax(3),bp,bp,3,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,bp,3,2(ax),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,ax(0),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,ax(0),c点位置,ax(0),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,ax(0),c点位置,ax(0),bp,+6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,c点位置,ax(0),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,c点位置,ax(0),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,c点位置,ax(0),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,c点位置,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,c点位置,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,1,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,ax(1),c点位置,ax(1),bp,+6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,ax(1),bp,+6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,ax(1),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,ax(1),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,ax(1),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,ax(1),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,c点位置,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,1,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2(ax),c点位置,ax(2),bp,+6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2,c点位置,ax(2),bp,+6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2,c点位置,ax(2),bp,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2,c点位置,ax(2),fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2,c点位置,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,2,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,3,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: dec ax push ax call fact pop ax mul word ptr bp+6 exit: mov bp+6 ,ax pop bp pop ax ret fact endp end,a点位置,ax(3),bp,6,fact proc push ax push bp mov bp,sp mov ax , bp+6 cmp ax,0 jne re_fact inc ax jmp exit re_fact: d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南特殊教育职业学院《水污染控制工程》2023-2024学年第二学期期末试卷
- 中山智慧路灯施工方案
- 桥墩涉水施工方案怎么写
- 天津铁道职业技术学院《景观设计》2023-2024学年第一学期期末试卷
- 2025标准式办公室租赁合同
- 2025至2030年中国高碱玻璃球数据监测研究报告
- 2025至2030年中国除焦清灰剂数据监测研究报告
- 别墅扩建施工方案模板
- 2025至2030年中国聚氯乙烯软制品挤出板数据监测研究报告
- 2025至2030年中国睡伴胶囊数据监测研究报告
- 2025年浙江省温州市中考一模数学模拟试题(含答案)
- 国有企业问责管理制度及实施细则草稿
- 《卵石动物造型》名师课件
- 腾讯游戏引擎技术向工业数字孪生的迁移
- 腰椎结核专科知识
- 教育政策的国际比较研究-深度研究
- 生活垃圾焚烧处理厂垃圾焚烧炉设计方案
- “趣”破“蛐蛐”小妙招社交魔法课主题班会
- 快递小哥交通安全课件
- 2025年青海能源投资集团有限责任公司招聘笔试参考题库含答案解析
- 2025年河南建筑职业技术学院单招职业技能测试题库审定版
评论
0/150
提交评论