微机原理与技术实验四:子程序结构
微机原理实验4——子程序的定义与调用

班级:计科1202班姓名:陈秉耀学号:201216010106实验4——子程序的定义与调用1、实验目的掌握子程序编写和调用;掌握子程序的参数传递和返回值的获取方法;2、实验内容实验2(2):“调用DOS中断,完成字符串的以下输入和输出操作。
具体要求是:①调用INT 21H的AH=09H子功能输出提示信息“Input String:”,②调用INT 21H的AH=0AH 子功能输入一个字符串,③输出回车(ASCII码为0DH)、换行(ASCII码为0AH),④将输入字符逐一改大写后输出。
设计四个子程序,分别对应上面每一小步子功能,在主程序调用。
============================================================================ ====实验报告============================================================================ ====DATAS SEGMENT;此处输入数据段代码keynum =255string db keynum;定义键盘需要的缓冲区db 0db keynum dup(0)string1 db'Input String',"$"DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码call dp1call dp2call dp3call dp4MOV AH,4CHINT 21H;输出提示信息Input Stringdp1 procpush dxmov ah,09hmov dx,offset string1int 21hpop dxretdp1 endp;输出回车,换行dp2 procpush axmov ah,02hmov dl,0dhint 21hmov ah,02hmov dl,0ahint 21hpop axretdp2 endp;输入一个字符串dp3 procpush dxmov dx,offset stringmov ah,0ahint 21hpop dxretdp3 endp;将输入字符逐一改大写后输出dp4 procpush bxmov dl,0ah ;换行mov ah,2int 21hmov bx,offset string+1mov cl,[bx]mov ch,0again: inc bxmov dl,[bx]cmp dl,'a'jb dispcmp dl,'z';比较是否为小写字母ja dispsub dl,20h;将小写字母转化为大写字母disp:mov ah,2int 21hloop againpop bxretdp4 endp CODES ENDSend start\。
微机原理 04-8

4.3 汇编语言程序设计的基本方法
——子程序及过程定义
CODES
SEGMENT ASSUME CS:CODES SP=00F8H BCD-16B PROC FAR AX PUSH BX BX PUSH AX ADD SI,CX IP MOV DX,0 CS BCDL: DEC SI PUSH CX PUSH BX, PUSH AX指 MOV AL,[SI]
4.3 汇编语言程序设计的基本方法
——子程序及过程定义
信息的保护与恢复方法有以下两种: 在子程序中进行
2.在主程序中进行
4.3 汇编语言程序设计的基本方法
——子程序及过程定义
在子程序中对信息进行保护与恢复的方法
子程序名 PROC PUSH AX PUSH BX PUSH CX
;信息的保护
POP CX POP BX POP AX RET 子程序名 ENDP
4.3 汇编语言程序设计的基本方法
——子程序及过程定义 主程序 SUB1 SUB2 SUB3
… …
… …
… …
CALL SUB1
… …
CALL SUB2
CALL SUB3
RET 图4.3.18
RET
RET
4.3 汇编语言程序设计的基本方法
——子程序及过程定义
6.信息的保护与恢复 在子程序设计时,肯定要用到一些寄存 器,而这些寄存器在主程序也用到了。我们 期望这些寄存器的值在子程序调用与返回后 ,保持原来主程序中的值不变,这就需要对 这些寄存器的值进行保护。而保护这些寄存 器值的方法是利用堆栈操作。
…
;信息的恢复
4.3 汇编语言程序设计的基本方法
——子程序及过程定义
在主程序中对信息进行保护与恢复的方法
实验报告 子程序设计实验

实验5 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
4. 掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATAS SEGMENTBUF DB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010BCAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START:MOV AX,DATASMOV DS,AXMOV CL,10LEA SI,BUFLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1EXIT:MOV AH,4CHINT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDP显示子程序DISP PROC NEAR ;MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPCODES ENDSEND START2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符'b'的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
微机实验报告子程序结构的设计方法

实验五 子程序结构的设计方法专业:材料物理; 姓名:曾瑞; 学号:20113012300191,实验内容,实验内容 编程计算编程计算N !,从键盘上接受10以内的数,计算出其阶乘后在屏幕显示结果;计算出其阶乘后在屏幕显示结果;2,实验要求,实验要求用子程序编写计算用子程序编写计算N !的代码以及结果显示代码;!的代码以及结果显示代码;3,实验目的,实验目的学习子程序结构,了解子程序的调用、返回的过程,掌握其编程的方法;4,程序流程图,程序流程图5,源程序,源程序;FILENAME ZENG.ASM DA T A SEGMENTMESG1 DB 'PLEASE INPUT A NUMBER BETWEEN 0 AND 9',0DH,0AH,'$' MESG2 DB ' ERROR MESSAGE!',0DH,0AH,'$' MESG3 DB '!=','$' STORE DW ? DA T A ENDS STACK SEGMENT DB 256 DUP(?) 开始开始从键盘上取得一个数字,并转换成二进制数转换成二进制数调用CALCUL 调用PRINT 调用CRLF 结束结束计算输入数字的阶乘的阶乘将结果显示输出将结果显示输出显示回车换行显示回车换行STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESG1 ;输出提示语句输出提示语句MOV AH,09H INT 21H MOV AH,1 ;键盘输入一个字符并回显键盘输入一个字符并回显 INT 21H CMP AL,20H ;如果输入的是空格,则返回如果输入的是空格,则返回 JZ EXIT XOR AL,30H ;将ASCII码转换成二进制数码转换成二进制数 CMP AL,0 ;将AL中数与0比较比较 JNZ NEXT INC AL ;若为0,则加一,则加一NEXT: CMP AL,9 ;与9进行比较进行比较JA ERROR ;若大于9,则跳转,则跳转PUSH AX ;将AX中内容堆栈,保护输入数保护输入数 LEA DX,MESG3 MOV AH,09H INT 21H POP AX CALL CALCUL CALL PRINT CALL CRLF JMP START ERROR: MOV DX,OFFSET MESG2 ;输出提示信息,提醒输入有误输出提示信息,提醒输入有误 MOV AH,09H INT 21H JMP START EXIT: MOV AH,4CH INT 21H MAIN ENDP CALCUL PROC MOV AH,0 MOV CX,AX ;CX存放输入的数字存放输入的数字MOV AL,1 ;将AX初始值赋1 MOV DX,0 MOV BX,0 AGAIN: INC BX MUL BX CMP BX,CX JNZ AGAIN ;若BX小于CX,则循环执行,则循环执行 RET CALCUL ENDP PRINT PROC MOV CX,0 CMP DX,0 ;将DX中内容与0比较比较 JZ THEN MOV BX,10 DIV BX PUSH DX INC CX THEN: MOV DX,0 MOV [STORE],AX ;[STORE]是个字单元,在数据段已是个字单元,在数据段已 MOV BX,10 ;有定义有定义DIV BX PUSH DX ;将余数堆栈将余数堆栈INC CX ;CX当计数器,存放堆栈的次数当计数器,存放堆栈的次数 CMP DX,[STORE] JNZ THEN ;若余数与被除数不等,继续循环若余数与被除数不等,继续循环 DISPLAY: POP DX ;出栈,把数据赋给DX ADD DL,30H ;DL存放欲显示数的ASCII码MOV AH,2 INT 21H LOOP DISPLAY RET PRINT ENDP CRLF PROC MOV DL,0DH ;显示回车与换行显示回车与换行MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H RET CRLF ENDP CODE ENDS END MAIN 5,实验结果及分析,实验结果及分析(1)程序运行结果如下:)程序运行结果如下:PLEASE INPUT A NUMBER BETWEEN 0 AND 9 0!=1 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 1!=1 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 2!=2 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 3!=6 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 4!=24 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 5!=120 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 6!=720 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 7!=5040 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 8!=40320 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 9!=362880 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 H ERROR MESSAGE !注意:当输入其他字符时,比如H ,则显示‘ERROR MESSAGE !’ (2)需要说明的有以下几点:)需要说明的有以下几点: ①① 用INT21H 指令执行功能调用会影响AX 中的数据,因此在调用前必须将AX 中的数据进行堆栈操作。
微机原理实验--子程序与宏指令

27.编制计算N(N<50)个偶数之和(2+4+6+…)的子程序和接收键入N及将结果显示在主程序。
子程序代码:stack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序acall sum;调用子程序sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hRETstart endpsum proc;定义子程序sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,axmov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxRETsum endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0RETa endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endpcode endsend start截图如下:宏指令代码:sum macro A;定义宏sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,Amov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxendmstack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序aSUM ax;宏展开sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hretstart endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0reta endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endp code endsend start 截图如下:。
微机原理与接口技术(4-3)

ASSUME CS:PCODE,DS:MDATA,SS:MSTACK CS:PCODE,DS:MDATA,SS: ;寄存器保护
BP,SP BP, CX,[BP+10] CX,[BP+10] BX,[BP+12] BX,[BP+12] AX,0 AX, AL,[BX] AL, ;数组相加 ;数组长度→ ;数组长度→CX ;数组ARY起始地址→ ;数组ARY起始地址→BX
CODE EDNS
§4-4 程序设计方法——子程序结构 程序设计方法——
例 4-15 通过堆栈传递参数 , 实现十进制数数组求和 , 要 通过堆栈传递参数, 实现十进制数数组求和, 求主程序和过程不在同一个代码段中, 要进行段间调用。 求主程序和过程不在同一个代码段中 , 要进行段间调用。 相应 程序如下:
;送数组和→ ;送数组和→SUM
;返回作废参数
PADD ENDP PCODE ENDS END START
15
§4-4 程序设计方法——子程序结构 程序设计方法——
该例用堆栈传递参数,堆栈中数据变化如图4 11所示。 该例用堆栈传递参数,堆栈中数据变化如图4-11所示。 总结: 总结: ⑴调用前通过堆栈传递两个参数:数组的偏移地址值, 数 调用前通过堆栈传递两个参数:数组的偏移地址值, 组长度。 组长度。 ⑵进入过程时重新定义CS段:指向当前代码段PCODE。 进入过程时重新定义CS段:指向当前代码段PCODE。 ⑶过程返回时:用返回指令RET 4,将通过堆栈传递的4个 过程返回时:用返回指令RET 将通过堆栈传递的4 参数作废。 参数作废。
5
;高4位乘10后加低4位 位乘10后加低4
CX
§4-4 程序设计方法——子程序结构 程序设计方法—— 说明: 说明:
第六章 子程序结构

PUBLIC伪指令 (1) PUBLIC伪指令 格式: 符号] 格式:PUBLIC 符号 [,符号] 功能:说明其后的符号是全局符号。 功能:说明其后的符号是全局符号。 全局符号能被其他模 块引用。 局部符号) 块引用。(局部符号) EXTRN伪指令 (2) EXTRN伪指令 格式: 符号: 符号:类型] 格式:EXTRN 符号:类型 [,符号:类型] 功能:说明在本模块中需要引用的、 功能:说明在本模块中需要引用的、 由其他模块定义的符 号,即外部符号。
pop ax pop bp ret 6 Proadd endp Code2 ends end start
Sp
sp
(Sp→)bp
di si cx ax bp
IP CS
Sp Sp Sp
[bp+06h] [bp+08h] [bp+0ah]
Sum地址 地址 Count地址 地址 Ary地址 地址
Sp
5
多个模块之间的参数传送问题
Crlf
Crlf
proc near mov ah, 2 mov dl, odh int 21h mov dl, oah int 21h ret endp
Decihex ends
end repeat
2 如果过程和调用过程在同一源文件(同一模块)中, 如果过程和调用过程在同一源文件(同一模块) 则过程可直接访问模块中的变量。 则过程可直接访问模块中的变量。
; source module 1 extrn var2:word,lab2:far public var1,lab1 Data1 segment var1 db ? var3 dw ? var4 dw ? Data1 ends code1 segment assume cs:code1,ds:data1 Main proc far start: mov ax , data1 mov ds,ax … lab1: lab1: … mov ah,4ch int 21h Main endp Code1 ends End start
第6章子程序结构

;每次乘的
;结果在BX中
8
计算机科学与技术系
《汇编语言》
Binihex proc near
mov ch, 4 Rotate: mov cl, 4
rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print add dl, 7h
;
SEGY SEGMENT
…
CALL SUBT
…
2022/2/20
SEGY ENDS
5
计算机科学与技术系
《汇编语言》
6.1.3 保护现场和恢复现场
例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则 可采用如下方法保护和恢复现场.
PROG
PROC
PUSH AX
PUSH BX PUSH CX
NEXT: ADD AX , [SI] ADD SI , 2 LOOP NEXT MOV SUM , AX POP DI POP SI POP CX POP AX RET
PROADD ENDP
CODE ENDS 11 END START
计算机科学与技术系
《汇编语言》
3 通过地址表传递参数 PROADD PROC NEAR
Stack ends
Code segment
assume cs:code, ds:data, ss:stack
Main proc far Begin: push ds
xor ax, ax push ax mov ax,data mov ds, ax lea bx, string push bx push num
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理与技术实验四:子程序结构
实验四:子程序设计
一、实验目的:掌握子程序结构,熟悉汇编上机环
境。
二、实验内容:设有数组SCORE存放学生的成绩
(0~100分),编写一个子程序统计0~59分、60~69分、70~79分、80~89分、90~100分的人数,并分别存放到SCOREE、SCORED、SCOREC、SCOREB、SCOREA单元中。
编写一个主程序与之配合使用。
三、实验步骤:
1、在“轻松汇编”环境下编写、编译和生成程序;
2、进入DEBUG界面,运行程序,观察SCOREE、SCORED、SCOREC、SCOREB、SCOREA变量的值是否正确:
在DEBUG下运行程序:F9键
观察多个变量值:“Data”→“Add Watch”→“输入变量1”
“Data”→“Add Watch”
“输入变量2”
……
四、流程图与源程序:
DATA SEGMENT
SCORE DB 80,78,45,81,90,72,60,75
SCOREE DB 0
SCORED DB 0
SCOREC DB 0
SCOREB DB 0
SCOREA DB 0
DATA ENDS
STCK SEGMENT
DB 10 DUP(?)
STCK ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA,SS:STCK
START:
补全程序
MOV AH,4CH
INT 21H
;以下为子程序
COUNT PROC
补全程序
RET
COUNT ENDP
CODE ENDS
END START
主程序开始
设置地址指针指向SCORE 首地址
设置循环次数=SCORE 元素个数
调成绩判断子程序
地址指针加一
循环次数减一
循环次数=0
N 返回DOS Y
子程序开始
取当前地址指针所指向的元素
当前元素<90SCOREA 加一
当前元素<80SCOREB 加一
当前元素<70SCOREC 加一
当前元素<60SCORED 加一
SCOREE 加一
子程序返回
N Y
N Y
N Y
N Y
五、实验小结
说明:实验报告要包涵上述五项
DATA SEGMENT
SCORE DB 80,78,45,81,90,72,60,75
SCOREE DB 0
SCORED DB 0
SCOREC DB 0
SCOREB DB 0
SCOREA DB 0
DATA ENDS
STCK SEGMENT
DB 10 DUP(?)
STCK ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA,SS:STCK
START:
MOV AX,DATA
MOV DS,AX
LEA SI,SCORE
MOV CX,8
A1: CALL COUNT
INC SI
DEC CX
CMP CX,0
JNZ A1
MOV AH,4CH
INT 21H
COUNT PROC
MOV AL,[SI]
CMP AL,90
JNB A2
CMP AL,80
JNB A3
CMP AL,70
JNB A4
CMP AL,60
JNB A5
INC SCOREE
RET
A2: INC SCOREA
RET
A3: INC SCOREB
RET
A4: INC SCOREC
RET
A5: INC SCORED
RET
COUNT ENDP
CODE ENDS
END START。