版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2021-7-980 x86汇编语言程序设计第第6 6章章 子程序结构子程序结构 讲授要点讲授要点 子程序的定义、调用与返回。子程序的定义、调用与返回。子程序的参数传递方法。子程序的参数传递方法。2021-7-980 x86汇编语言程序设计子程序调用和返回指令:子程序调用和返回指令:code1 segmentcode1 segmentmain proc main proc farfar callcall far ptr subp far ptr subp ret retmain endpmain endpcode1 endscode1 endscode2 segmentcode2 segmen
2、tsubp proc subp proc farfar retretsubp endpsubp endpcode2 endscode2 ends 段间调用和返回段间调用和返回code segmentcode segmentmain proc main proc farfar call call subp subp ret retmain endpmain endpsubp proc subp proc nearnear retretsubp endpsubp endpcode endscode ends 段内调用和返回段内调用和返回2021-7-980 x86汇编语言程序设计 CALL 调用指
3、令调用指令段内直接近调用:段内直接近调用:CALL DST执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (IP) + 16位位移量位位移量段内间接近调用:段内间接近调用:CALL DST执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (EA)2021-7-980 x86汇编语言程序设计段间直接远调用:段间直接远调用:CALL DST执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (I
4、P) (IP) 偏移地址偏移地址 (CS) 段地址段地址段间间接远调用:段间间接远调用:CALL DST执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (EA) (CS) (EA+2)2021-7-980 x86汇编语言程序设计RET 返回指令返回指令段内近返回:段内近返回:RET执行操作:执行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2段内带立即数近返回:段内带立即数近返回:RET EXP段间远返回:段间远返回:RET执行操作:执行操作:
5、 (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 (CS) ( (SP)+1,(SP) ) (SP) (SP) + 2段间带立即数远返回:段间带立即数远返回:RET EXP2021-7-980 x86汇编语言程序设计例:带立即数返回例:带立即数返回(SP)(SP) 堆栈段堆栈段code segmentcode segmentmain proc farmain proc far push ax push ax push bx push bx push cx push cx call sub call sub ret retmain endpmain endpsub proc
6、 sub proc nearnear ret 6 ret 6sub endpsub endpcode endscode ends(IP)(IP)(cx)(cx)(bx)(bx)(ax)(ax)(SP)(SP)(SP)(SP)2021-7-980 x86汇编语言程序设计6.16.1子程序子程序概述概述 6.1.1 6.1.1 过程的定义过程的定义 过程定义由过程定义由PROC与与ENDP伪指令实现,形式如下:伪指令实现,形式如下: 过程名过程名 PROC NEAR|FAR 过程名过程名 ENDP 1. 过程名在整个程序中必须是唯一的。过程名在整个程序中必须是唯一的。 2. 过程名本质上与标号一样
7、,也具有过程名本质上与标号一样,也具有3种属性:段地址、种属性:段地址、偏移地址和类型(偏移地址和类型(NEAR或或FAR)。)。 3. PROC后用关键字后用关键字NEAR、FAR或空,以表示过程或空,以表示过程的类型(缺省为的类型(缺省为NEAR)。)。2021-7-980 x86汇编语言程序设计6.1.2 6.1.2 过程调用和返回过程调用和返回1 1过程调用和返回指令过程调用和返回指令(1)CALL:过程调用:过程调用 与与JMP指令类似,指令类似,CALL指令包括下列指令包括下列4种调用方式:种调用方式: 段内直接调用(段内直接调用(Intrasegment/Direct Call)
8、 段间直接调用(段间直接调用(Intersegment/Direct Call) 段内间接调用(段内间接调用(Intrasegment/Indirect Call) 段间间接调用(段间间接调用(Intersegment/Indirect Call) 段内调用在同一代码段内进行,又称近(段内调用在同一代码段内进行,又称近(Near)调用;调用; 段间调用可以在不同代码段之间进行,又称远(段间调用可以在不同代码段之间进行,又称远(Far)调用。调用。2021-7-980 x86汇编语言程序设计语法格式:语法格式:CALL ProcName 段内直接调用:段内直接调用:IP进栈,进栈,IP = la
9、bel的偏移地址;的偏移地址; 段间直接调用:段间直接调用:CS:IP 进栈,进栈,CS:IP = label的分段地址的分段地址CALL reg16/mem16 段内间接调用:段内间接调用:IP进栈,进栈,IP = reg16 / mem16 CALL mem32 段间间接调用:段间间接调用: CS:IP 进栈,进栈,CS = mem32高字,高字,IP = mem32低字低字功能描述:功能描述:(1)返回地址进栈。)返回地址进栈。远调用:远调用:CS与与IP(下一条指令的地址)依次进栈。(下一条指令的地址)依次进栈。 近调用:近调用:IP(下一条指令的(下一条指令的16位偏移地址)进栈。位
10、偏移地址)进栈。 (2)转移到过程的第)转移到过程的第1条指令去执行。条指令去执行。远调用:根据操作数,将远调用:根据操作数,将32位地址送位地址送CS:IP。 近调用:根据操作数,将近调用:根据操作数,将16位偏移地址送位偏移地址送IP。 对标志位的影响:无。对标志位的影响:无。2021-7-980 x86汇编语言程序设计(2)RET指令指令RET(Return):过程返回):过程返回 语法格式:语法格式:RET; 近返回或远返回近返回或远返回RETimm16 ; 近返回或远返回,并调整堆栈:近返回或远返回,并调整堆栈:SP = SP + imm16 功能描述:功能描述: RET:返回地址出
11、栈,从而实现转移到返回地址处。其中,:返回地址出栈,从而实现转移到返回地址处。其中,远返回:远返回:POP 1个双字到个双字到CS:IP。 近返回:近返回:POP 1个字到个字到IP。 RET imm16:在返回地址出栈后,:在返回地址出栈后,CPU立即将立即将imm16加到堆栈加到堆栈指针指针SP。这种机制用来在返回前将参数从栈中移出。这种机制用来在返回前将参数从栈中移出。 对标志位的影响:无。对标志位的影响:无。 说明:说明:RET由汇编程序根据其所在过程的类型(由汇编程序根据其所在过程的类型(NEAR或或FAR)决定是近返回还是远返回。缺省为近返回。决定是近返回还是远返回。缺省为近返回。
12、2021-7-980 x86汇编语言程序设计2 2使用过程应注意的问题使用过程应注意的问题 在过程体内必须有一条在过程体内必须有一条RETRET指令被执行到。如果在过程内没有执指令被执行到。如果在过程内没有执行到行到RETRET或其它转移指令,程序将继续执行或其它转移指令,程序将继续执行ENDPENDP后的指令。后的指令。 正确选择过程的类型。通常基于下列原则:正确选择过程的类型。通常基于下列原则: 若过程只在同一代码段中被调用,则定义为若过程只在同一代码段中被调用,则定义为NEARNEAR。 若过程可以在不同代码段中被调用,则定义为若过程可以在不同代码段中被调用,则定义为FARFAR。 通常
13、要保证通常要保证RETRET指令执行前,栈顶内容正好是返回地址。指令执行前,栈顶内容正好是返回地址。 注意保护相关寄存器的值。通常,除了作为返回参数的寄存器外,注意保护相关寄存器的值。通常,除了作为返回参数的寄存器外,过程不应改变其它寄存器的值。过程不应改变其它寄存器的值。 可以将过程定义放在单独的代码段中。若过程定义与主程序处于可以将过程定义放在单独的代码段中。若过程定义与主程序处于同一代码段,则要保证其只有被调用时,才会执行。同一代码段,则要保证其只有被调用时,才会执行。2021-7-980 x86汇编语言程序设计3. 保存和恢复寄存器保存和恢复寄存器例例: SUBT PROC NEAR
14、: SUBT PROC NEAR PUSH AX PUSH AX PUSH BX PUSH BX PUSH CX PUSH CX POP CX POP CX POP BX POP BX POP AX POP AX RET RET SUBT ENDP SUBT ENDP2021-7-980 x86汇编语言程序设计【例【例6.1】分析下列程序,描述它的功能。】分析下列程序,描述它的功能。 dseg SEGMENT buf DB 80,81 DUP(0) dseg ENDS sseg SEGMENT STACK DW 64 DUP(0) sseg ENDS cseg SEGMENT ASSUME C
15、S:cseg,DS:dseg,SS:sseg2021-7-980 x86汇编语言程序设计 cr PROC (NEAR) MOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H RET cr ENDP2021-7-980 x86汇编语言程序设计main:MOV AX,dseg MOV DS,AX LEA DX,buf MOV AH,10 INT 21H ;输入一个符号串输入一个符号串 CALL cr MOV AH,1 INT 21H ;输入一个字符输入一个字符 MOV BL,AL ;用用BL保存读入的字符保存读入的字符2021-7-980 x86汇编语言程序设计
16、 lab2: MOV DL,SI CMP DL,BL JZ lab1 ;等于第等于第2次输入的符号则转次输入的符号则转 MOV AH,2 INT 21H INC SI LOOP lab2 lab1:MOV AH,4CH INT 21H cseg ENDS END main2021-7-980 x86汇编语言程序设计【例【例6.2】编写一个子程序,对一个无符号的字型数组的各元素求和。在调】编写一个子程序,对一个无符号的字型数组的各元素求和。在调用子程序之前,已把数组的段地址放在用子程序之前,已把数组的段地址放在DS中,起始偏移地址放在寄存器中,起始偏移地址放在寄存器SI中,数组元素个数中,数组元
17、素个数(0)放在放在CX中。要求子程序把计算结果以双字的形式存中。要求子程序把计算结果以双字的形式存放,高位放在放,高位放在DX中,低位放在中,低位放在AX中。中。 sum PROC NEAR PUSH BX ;保护用到的寄存器保护用到的寄存器BX XOR AX,AX MOV DX,AX ;求和前先把存放结果的求和前先把存放结果的DX,AX清清0 MOV BX,AX2021-7-980 x86汇编语言程序设计s1: ADD AX,BX+SI ;把一个元素加到把一个元素加到AX中中 ADC DX,0 ;若有进位,若有进位,DX加加1 INC BX INC BX ;BX加加2,指向数组的下一元素,
18、指向数组的下一元素 LOOP s1 POP BX ;恢复寄存器恢复寄存器BX的值的值 RETsum ENDP2021-7-980 x86汇编语言程序设计6.2 6.2 过程的参数传递过程的参数传递 参数的分类:参数的分类: 入口参数:由调用者向过程传递的数据,作为过程的输入参数。入口参数:由调用者向过程传递的数据,作为过程的输入参数。 出口参数:由过程向调用者返回的数据,作为过程的输出参数。出口参数:由过程向调用者返回的数据,作为过程的输出参数。 根据问题的需要,过程可以只有入口参数或只有出口参数,也可以根据问题的需要,过程可以只有入口参数或只有出口参数,也可以二者兼有。二者兼有。 对于过程与
19、调用者之间的参数传递,可根据传递的数据量,选择采对于过程与调用者之间的参数传递,可根据传递的数据量,选择采用寄存器、变量或堆栈等方式。由于过程是相对独立的功能块,因此,用寄存器、变量或堆栈等方式。由于过程是相对独立的功能块,因此,在定义过程时,通常要加上适当的注释,主要包括功能、入口参数与出在定义过程时,通常要加上适当的注释,主要包括功能、入口参数与出口参数等。口参数等。2021-7-980 x86汇编语言程序设计6.2.1 6.2.1 用变量传递参数用变量传递参数 在程序中定义全局变量,如放在数据段,过程直接按名访问该变量。在程序中定义全局变量,如放在数据段,过程直接按名访问该变量。 过程直
20、接以变量作为参数,虽然方便,但通用性较差过程直接以变量作为参数,虽然方便,但通用性较差。 【例【例6.3】编写一个子程序,以放在】编写一个子程序,以放在DS段中段中year的公元年份为入口参的公元年份为入口参数,判断该年是否为闰年。数,判断该年是否为闰年。 另有一个应用程序,它已定义了一个字节型数组另有一个应用程序,它已定义了一个字节型数组t,依次存放着,依次存放着12个月的每月天数,其中个月的每月天数,其中2月份的天数是月份的天数是28。应用程序已经在。应用程序已经在DS段段中存放了年份值,利用前面编写的子程序,编写程序段调整数组中存放了年份值,利用前面编写的子程序,编写程序段调整数组t中中
21、2月份的天数。月份的天数。2021-7-980 x86汇编语言程序设计【解】【解】 ;功能:根据一个年份是否为闰年,设置该年功能:根据一个年份是否为闰年,设置该年2月份的天数月份的天数 ;入口:入口:DS段中的字型变量段中的字型变量year 公元年份公元年份 ;出口:出口:DS段中的字节型变量段中的字节型变量t+1t+1 该年该年2月份天数月份天数 ;破坏寄存器:无破坏寄存器:无 jud1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV BYTE PTR t+1,28 MOV AX,year2021-7-980 x86汇编语言程序设计 MOV DX,
22、0 MOV BX,4 DIV BX ;除以除以4 CMP DX,0 JNZ lab1 ;不能整除不能整除4则不是闰年,转则不是闰年,转 MOV AX,year ;取回年份值取回年份值 MOV BX,100 DIV BX ;除以除以100 CMP DX,0 JNZ lab2 ;不能整除不能整除100则是闰年,转则是闰年,转 MOV AX,year MOV BX,400 DIV BX ;除以除以4002021-7-980 x86汇编语言程序设计 CMP DX,0 JZ lab2 lab2: INC BYTE PTR t+1 ;是闰年,把天数加是闰年,把天数加1,设置出口参数,设置出口参数 lab1
23、 : POP DX POP CX POP BX POP AX RET Jud1: ENDP2021-7-980 x86汇编语言程序设计6.2.2 6.2.2 用寄存器传递参数用寄存器传递参数 通过寄存器传递数据或数据地址。通过寄存器传递数据或数据地址。 通常选择通常选择AL、AX、DX:AX(或(或EAX)传递字节、字或双字。)传递字节、字或双字。 传递传递16位偏移地址最好选择位偏移地址最好选择SI、DI或或BX, 传递传递32位地址可以用位地址可以用DS:BX、DS:SI、DS:DI、ES:BX、ES:SI或或ES:DI等。等。2021-7-980 x86汇编语言程序设计【例【例6.4】用
24、寄存器传递参数,编写例】用寄存器传递参数,编写例6.3要求的子程序。要求的子程序。 【解】【解】 ; ;功能:判断一个年份是否为闰年功能:判断一个年份是否为闰年 ; ;入口:入口:AX AX 公元年份公元年份 ; ;出口:出口:CFCF,1 1表示是闰年,表示是闰年,0 0表示非闰年表示非闰年 ; ;破坏寄存器:破坏寄存器:AXAX jud PROC NEAR PUSH BX PUSH CX PUSH DX MOV CX,AX ; ;临时保存年份值临时保存年份值 MOV DX,0 MOV BX,42021-7-980 x86汇编语言程序设计 DIV BX ; ;除以除以4 4,为预防溢出,用双
25、字除以字,为预防溢出,用双字除以字 CMP DX,0 JNZ lab1 ; ;不能整除不能整除4 4则不是闰年,转则不是闰年,转 MOV AX,CX ; ;取回年份值取回年份值 MOV BX,100 DIV BX ; ;除以除以100100 CMP DX,0 JNZ lab2 ; ;不能整除不能整除100100则是闰年,转则是闰年,转 MOV AX,CX MOV BX,400 DIV BX ; ;除以除以400400 CMP DX,0 JZ lab22021-7-980 x86汇编语言程序设计 lab1: CLC ; ;把把CFCF清清0 0表示非闰年,设置出口参数表示非闰年,设置出口参数 J
26、MP lab3 lab2: STC ; ;把把CFCF置置1 1表示是闰年,设置出口参数表示是闰年,设置出口参数 lab3: POP DX POP CX POP BX RET jud ENDP 对于对于DXDX中存放的年份值,需要先放到中存放的年份值,需要先放到AXAX中,才能调用子程序中,才能调用子程序judjud,然后以调用返回后的然后以调用返回后的CFCF值决定是否把值决定是否把t t数组中表示数组中表示2 2月份天数的月份天数的t+1t+1加加1 1。程序段如下:。程序段如下: MOV AX,DX CALL jud ADC BYTE PTR t+1,0 ; ;原值原值0 0CFCF20
27、21-7-980 x86汇编语言程序设计6.2.3 6.2.3 用地址表传递参数用地址表传递参数 建立一个地址表,存放所有参数的地址,传递地址表的首地址给过程。建立一个地址表,存放所有参数的地址,传递地址表的首地址给过程。 这种方法特别适合于参数较多的情况。这种方法特别适合于参数较多的情况。2021-7-980 x86汇编语言程序设计6.2.4 6.2.4 用堆栈传递参数用堆栈传递参数 过程从堆栈得到入口参数,返回前将出口参数写入堆栈;调用者通过程从堆栈得到入口参数,返回前将出口参数写入堆栈;调用者通过出栈得到返回参数。过出栈得到返回参数。 过程从堆栈存取参数时,通常使用过程从堆栈存取参数时,
28、通常使用BPBP,因为其隐含的段地址在,因为其隐含的段地址在SSSS中。中。 采用堆栈传递参数时,典型的过程结构如下:采用堆栈传递参数时,典型的过程结构如下:StdProc procnear push bp mov bp, sp; BP指向当前栈顶,用于取入口参数指向当前栈顶,用于取入口参数 pop bp ret ParmSize ; 返回前从堆栈移出入口参数返回前从堆栈移出入口参数StdProc endp 其中,其中,ParmSize是过程被调用前进栈的入口参数的字节数。是过程被调用前进栈的入口参数的字节数。 2021-7-980 x86汇编语言程序设计【例【例6.5】用堆栈传递入口参数,编
29、写子程序,把接收的两个带符号】用堆栈传递入口参数,编写子程序,把接收的两个带符号整数中大的一个作为结果,出口参数放在整数中大的一个作为结果,出口参数放在AX中。中。 【解】【解】 ;功能:求两个带符号整数中大的一个功能:求两个带符号整数中大的一个 ;入口参数:调用前把两个带符号整数入栈入口参数:调用前把两个带符号整数入栈 ;出口参数:出口参数:AX ;破坏寄存器:破坏寄存器:AXAX2021-7-980 x86汇编语言程序设计_max PROC NEAR PUSH BP ;暂时保存寄存器暂时保存寄存器BP的值的值 MOV BP,SP MOV AX,WORD PTR BP+6 ;取第取第1个参数
30、到个参数到AX CMP AX,WORD PTR BP+4 ;与第与第2个参数比较个参数比较 JGE lab MOV AX,WORD PTR BP+4 ;取第取第2个参数到个参数到AX lab: POP BP ;恢复寄存器恢复寄存器BP的原值的原值 RET _max ENDP2021-7-980 x86汇编语言程序设计6.3 6.3 子程序举例子程序举例【例】编写子程序【例】编写子程序write,把整型数据以十进制形式显示到屏幕上。,把整型数据以十进制形式显示到屏幕上。【分析】参照高级语言中输出语句的功能,【分析】参照高级语言中输出语句的功能,write子程序应具备这样子程序应具备这样一些特点:
31、被显示的整数可以是无符号的,也可以是带符号的,一些特点:被显示的整数可以是无符号的,也可以是带符号的,但需要明确指出是哪一种情况;整数在计算机内部是字型数据,但需要明确指出是哪一种情况;整数在计算机内部是字型数据,范围为范围为32768+65535;被输出的数据是带符号数时,负号;被输出的数据是带符号数时,负号“”必须输出,而正号必须输出,而正号“”总是省略;输出数据的最大位数总是省略;输出数据的最大位数是十进制的是十进制的5位,当计算出位,当计算出5位中的某一位是位中的某一位是0时,需要判断这个时,需要判断这个0是否应该输出,输出条件是前面已经输出过非是否应该输出,输出条件是前面已经输出过非
32、0数字或者这个数字或者这个0是是个位数。输出的数必须是以个位数。输出的数必须是以ASCII码形式存放在码形式存放在DL中。中。2021-7-980 x86汇编语言程序设计【解】【解】 ; 功能功能 : 在屏幕上输出整数值在屏幕上输出整数值 ; 入口入口 : AX 待输出的整数待输出的整数 ; CF 为为0表示输出无符号数,为表示输出无符号数,为1则输出带符号数则输出带符号数 ; 出口出口 : 无无 ; 破坏寄存器破坏寄存器 : 无无 ;DXDX、AX-AX-存放整数,存放整数,BX-BX-分离各整数位时除数,分离各整数位时除数,CX-CX-分离各数位次数,分离各数位次数, ;SI-SI-表示是
33、否输出过非表示是否输出过非0 0数字,数字,DI-DI-暂存输出的整数暂存输出的整数 write PROC NEAR PUSH BX PUSH CX PUSH DX PUSH SI 2021-7-980 x86汇编语言程序设计 PUSH DI MOV SI,0 ;SI清清0表示还没有输出过非表示还没有输出过非0数字数字 MOV DI,AX ;保存待输出的数值到保存待输出的数值到DI中中 JNC w1 ;作为无符号数输出转作为无符号数输出转 CMP AX,0 JGE w1 ;AX是正数转是正数转 MOV DL, - MOV AH,2 INT 21H ;输出负号输出负号 NEG DI ;取绝对值放
34、在取绝对值放在DI中中2021-7-980 x86汇编语言程序设计 w1: MOV BX,10000 ;第一次的除数第一次的除数 MOV CX,5 ;重复次数重复次数 w2: MOV AX,DI ;取回待输出数值取回待输出数值 MOV DX,0 ;被除数高位清被除数高位清0 DIV BX ;做双字除以字的除法做双字除以字的除法 MOV DI,DX ;余数保存在余数保存在DI中中 CMP AL,0 JNE w3 ;商非商非0转转 CMP SI,0 ;商是商是0,判断前面是否输出过数字,判断前面是否输出过数字 JNE w3 ;前面已输出过数字,则当前的前面已输出过数字,则当前的0应应 该输出,转该
35、输出,转 CMP CX,1 ;判断是否是个位判断是否是个位 JNE w4 ;不是个位则不输出当前的不是个位则不输出当前的0,转,转2021-7-980 x86汇编语言程序设计 w3: MOV DL,AL ADD DL,30H MOV AH,2 INT 21H ;输出当前这一位数字输出当前这一位数字 MOV SI,1 ;用用SI记载已输出过数字记载已输出过数字 w4: MOV AX,BX MOV DX,0 MOV BX,10 DIV BX MOV BX,AX ;bx / 10 = bx,计算下一次的除数,计算下一次的除数 LOOP w22021-7-980 x86汇编语言程序设计 POP DI
36、POP SI POP DX POP CX POP BX RET write ENDP2021-7-980 x86汇编语言程序设计 【例【例6.11】编写子程序】编写子程序read,从键盘上读入一个整数。,从键盘上读入一个整数。 【分析】为了尽可能与高级语言中整数输入的情况一致,子程序【分析】为了尽可能与高级语言中整数输入的情况一致,子程序不仅要能读入正确输入时的数据,还要能对不正确的输入做出适当的不仅要能读入正确输入时的数据,还要能对不正确的输入做出适当的反应,因此设计上要注意几个问题:首先是要用字符串输入方式反应,因此设计上要注意几个问题:首先是要用字符串输入方式(DOS的的10号子功能号子
37、功能),因为这种方式支持退格键修改功能,因而需要,因为这种方式支持退格键修改功能,因而需要准备相应的输入缓冲区;出口参数需要两个,以准备相应的输入缓冲区;出口参数需要两个,以CF的设置表示输入的设置表示输入是否正确,当输入正确时把整数值放在是否正确,当输入正确时把整数值放在AX中作为输入结果;要能够中作为输入结果;要能够跳过若干个连续的空格符;要能够处理正负号。跳过若干个连续的空格符;要能够处理正负号。2021-7-980 x86汇编语言程序设计【解】【解】 ; 功能功能 : 从键盘读入整数值从键盘读入整数值 ; 入口入口 : CF 为为0表示废弃多余符号。表示废弃多余符号。 ; 为为1则把多
38、余符号留作下一次输入。则把多余符号留作下一次输入。 ; 出口出口 : CF 0表示正常读入,表示正常读入,1表示输入有错表示输入有错 ; 破坏寄存器破坏寄存器 : 无无 read PROC NEAR PUSH BX PUSH CX PUSH DX PUSH SI PUSH DS ;以上为寄存器保护以上为寄存器保护2021-7-980 x86汇编语言程序设计 PUSHF PUSH CS POP DS ;令令DS取取CS的值的值 rd1: MOV BX,CS:point ;取上次输入后已读取到输入串的位置取上次输入后已读取到输入串的位置 rd2: INC BX CMP CS:bufin+BX+1,
39、 JE rd2 ;跳过空格跳过空格 CMP CS:bufin+BX+1,13 JNZ rd4 ;不是回车键,转读入数值处理不是回车键,转读入数值处理2021-7-980 x86汇编语言程序设计 rd3: LEA DX,CS:bufin MOV AH,10 INT 21H ;遇回车键要求再次输入遇回车键要求再次输入 MOV AH,2 MOV DL,10 INT 21H ;换行换行 MOV CS:point,0 JMP rd1 ;对新的输入再转去跳过前导空格对新的输入再转去跳过前导空格 rd4: MOV SI,BX DEC SI ;令令SI指向输入串的第一个有效字符指向输入串的第一个有效字符 MOV AX,0 MOV BX,10 MOV CX,02021-7-980 x86汇编语言程序设计 rd5: CMP CS:bufin+SI+2, + JNZ rd6 ;不是正号转不是正号转 CMP CL,1 JE rd10 ;已读到正确数值后,遇正号转已读到正确数值后,遇正号转 CMP CL,0 JE rd8 ;正号是第一个有效字符转正号是第一个有效字符转 STC ;输入有错输入有错 JMP rd132021-7-980 x86汇编语言程序设计 rd6: CMP CS:bufin+SI+2, - JNZ rd9 C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德州市宁津县2025-2026学年第二学期五年级语文第四单元测试卷(部编版含答案)
- 百色市右江区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 天水市秦安县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 伊克昭盟杭锦旗2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 宜昌市五峰土家族自治县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 百色市隆林各族自治县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 玉林市容县2025-2026学年第二学期五年级语文第五单元测试卷(部编版含答案)
- 牛奶策划方案
- 出游策划书方案
- 深度解析(2026)《CBT 3719-1995船用高压齿轮泵技术条件》
- 耳针法(耳穴埋豆)操作评分标准
- MOOC 刑法学总论-西南政法大学 中国大学慕课答案
- 企业复工复产现场核查表
- 全面把握新时代的深刻内涵
- 2023年北京市各区(海淀朝阳丰台东西城等)高三下语文高考一模汇编7 基础运用含详解
- 工业机器人离线编程说课1010
- 2022年中国石油大学《化工原理二》完整答案详解
- 岩土工程原位测试5波速
- GB/T 21389-2008游标、带表和数显卡尺
- GB/T 17193-1997电气安装用超重荷型刚性钢导管
- GB/T 10156-2009水准仪
评论
0/150
提交评论