微机原理与技术实验四:子程序结构
微机原理实验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
子程序及中断实验

num dw 0 code ends end st
编写主程序实现子程序和中断服务子程序的调用
实验内容:
编写子程序设置40H中断为自定义中断服务子程序
编写中断服务子程序实现AX=AX+B或功能自拟。
编写主程序调用子程序和中断
二.理论分析或算法分析
1.中断向量表
表的地址位于内存的00000HH 003FFH,大小为1KB,用于存放256个中断的 中断服务程序的入口地址;每个入口占用4Bytes,低字为段内偏移,高字为段 基址。中断向量表如下图所示:
ax, es:[di]
mov
old, ax
mov
ax, es:[di+2]
mov
old+2, ax
mov
ax, offset newin t40
mov
es:[di], ax
mov
ax, seg newin t40
mov
es:[di+2], ax
sti
int 40h
jmp lp1
newint40 proc far add ax, bx mov num, ax iret
成绩:
计算机原理实验室实验报告
课程:
汇编语言与微机原理
姓名:
专业:
网络工程
学号:
日期:
2016年12月9日
太原工业学院
计算机工程系
实验五:子程序及中断实验
实验环境PC机+Win2007 +emu8086+proteus仿真器实验日期2016.12.9
一•实验内容
实验目的:
实现子程序和中断服务子程序的设计
jlmao微机原理ch4part4

初始化
初始化
循环体
根据控制条件转移
根据控制条件转移
Kunming University of Science & Technology
循环体
Page 20
(一) 单重循环
循环:计数循环、条件循环。
1、计数控制的循环:循环指令LOOP等。
MOV AL, X
MOV DL, 6
MUL DL
; AX=AL*DL
ADD AL, 8 ;
MOV DL, X ;
MUL DL
MOV Y, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END START
Kunming University of Science & Technology
Page 8
1、先画流程图,如右。
START
2、先尝试自己编程实现。 初始化
3、自己编好后,上机调试, AL←X
或与附录中的程序清单比较, AL≥0? Y
检查自己的程序是否正确。
N
AL=0? Y
Y←-1
N Y←1
Y←0
返回DOS END
Kunming University of Science & Technology
注意:使用LOOP指令时,CX做计数器。
例4:编制软件延时程序,设CPU的时钟频率为5MHz,编写 1ms延时程序。
解:分析:用空指令NOP和循环指令来做延时的基本框架。
第一步:确定程序框架,如下:
DELAY_1MS: MOV CX, N ; 4*1, 根据延时时间确定N
华工微机原理实验四子程序设计实验报告

华南理工大学微机原实验四:子程序设计一.实验目的1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图主程序的简略流程子程序一的简略流程图子程序二的简略流程图子程序三的简略流程图子程序4,显示时间流程图四、源程序代码DATA SEGMENTORG9999HMENU DB0DH,0AH,'Programed by Deng Tengfei Class Electronic Material Grade 09',0DH,0AH,;菜单DB'Please input1~5to choose service',0DH,0AH,DB'1:Convert a small letter to a big letter',0DH,0AH,DB'2:Seek the bigest number',0DH,0AH,DB'3:Put the character string in order',0DH,0AH,DB'4:Set time and check time',0DH,0AH,DB'5:End the program$'MEG0DB'Please choose function$';提示信息MEG0~MEG8MEG1DB'You have choose the function1.',0DH,0AH,'Please input the character string you want to convert:$'MEG2DB'You have choose the function2.',0DH,0AH,'Please input the character string:$'MEG3DB'You have choose the function3.',0DH,0AH,'Please input the character string you want to sort$'MEG4DB'You have choose the function4.',0DH,0AH,'Please input the time you want to set in format like:xx:xx:xx$'MEG5DB'The program is end$'MEG6DB'Sorry.you have chosen a undefined function.Please input a correct function number$' MEG7DB'Fail to set time$'MEG8DB'Press any key to do again or press the ESC key to return to the main menu$'FLAG DB-1;冒泡排序中使用的标志DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC NEAR;主程序MOV AX,DATAMOV DS,AXCIN:LEA DX,MENU;输出提示信息MOV AH,09HINT21HCALL ENT;输出回车换行LEA DX,MEG0MOV AH,09HINT21HCALL ENTMOV AH,01HINT21HCMP AL,30H;判断功能号JLE EORCMP AL,31HJE F1CMP AL,32HJE F2CMP AL,33HJE F3CMP AL,34HJE F4CMP AL,35HJE F5EOR:CALL ENTLEA DX,MEG6;输出出错信息MOV AH,09HINT21HJMP CINF1:CALL ENT;功能1LEA DX,MEG1MOV AH,09HINT21HCALL ENTCALL FUN1;调用子程序1MOV AH,01HINT21HCMP AL,1BHJNE F1JMP CINF2:CALL ENT;功能2LEA DX,MEG2MOV AH,09HINT21HCALL ENTCALL FUN2;调用子程序2MOV AH,01HINT21HCMP AL,1BHJNE F2JMP CINF3:CALL ENT;功能3LEA DX,MEG3MOV AH,09HINT21HCALL ENTCALL FUN3;调用子程序3MOV AH,01HINT21HCMP AL,1BHJNE F3JMP CINF4:CALL ENT;功能4LEA DX,MEG4MOV AH,09HINT21HCALL ENTCALL FUN4;调用子程序4MOV AH,01HINT21HCMP AL,1BHJNE F4JMP CINF5:MOV AH,4CH;功能5,终止程序INT21HFUN1PROC NEAR;子程序1PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AH;字符串输入INT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI];设定循环次数MOV CH,0JIK:INC SIMOV AL,[SI]CMP AL,0DH;判断字符ASCII码JE KLCMP AL,61HJB JKCMP AL,7AHJA JKSUB AL,20H;小写转大写JK:MOV DL,AL;输出字符MOV AH,02HINT21HLOOP JIKCALL ENTLEA DX,MEG8MOV AH,09HINT21HKL:POP SIPOP DXPOP CXPOP AXRETFUN1ENDPFUN2PROC NEAR;子程序2PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI]MOV CH,0INC SIMOV AL,[SI]FH:INC SI;循环比较CMP AL,[SI]JA FGMOV AL,[SI]FG:LOOP FHMOV DL,ALMOV AH,02HINT21HCALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP SIPOP DXPOP CXPOP AXRETFUN2ENDPFUN3PROC NEAR;子程序3PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV BL,[SI]MOV BH,0INC SIMOV DI,SILP1:CMP FLAG,0;根据标志判断JE LP3DEC BX;检查循环次数CMP BX,0JE LP3MOV CX,BXMOV SI,DIMOV FLAG,0LP2:MOV AL,[SI];前后比较CMP AL,[SI+1]JLE NEXTXCHG AL,[SI+1]MOV[SI],ALMOV FLAG,0FFHNEXT:INC SILOOP LP2;内循环继续JMP LP1;退出内循环LP3:DEC DI;重新设定循环次数MOV CL,[DI]MOV CH,0LP4:INC DI;循环输出字符MOV DL,[DI]MOV AH,02HINT21HLOOP LP4CALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETFUN3ENDPFUN4PROC NEAR;子程序4PUSH AXPUSH BXPUSH CXPUSH DXCALL CROT;调用子程序CROTMOV CH,AL;装入入口参数MOV AH,01HINT21HCALL CROTMOV CL,ALMOV AH,01HINT21HCALL CROTMOV DH,ALMOV DL,0CALL ENTMOV AH,2DH;调DOS中断置时间INT21HCMP AL,0FFHJE FALPRT:PUSH DX;输出时间MOV AL,CHMOV AH,0MOV BL,0AHDIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HMOV AL,CLMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HPOP DXMOV AL,DHMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV AH,2CH;调DOS中断取时间INT21HMOV AL,0AH;写入OCW3OUT20H,ALNOP;延时NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPIN AL,20H;读取IRRAND AL,02HJNE MKCALL COV;调子程序COVJMP PRTFAL:LEA DX,MEG7MOV AH,09HINT21HMK:CALL ENTMOV AH,01HINT21HLEA DX,MEG8MOV AH,09HINT21HPOP DXPOP CXPOP BXPOP AXRETFUN4ENDPCROT PROC NEAR;子程序CROT,完成ASCII码转换成两位十进制数PUSH BXPUSH CXPUSH DXMOV BL,0;初始化BL和BHMOV BH,0AHMOV DX,02H;设循环次数GET:MOV AH,01HINT21HSUB AL,30HCMP AL,0JB FALCMP AL,09HJA FALXCHG AL,BLMUL BHADD AL,BLXCHG AL,BLDEC DXCMP DX,0JNE GETMOV AL,BLPOP DXPOP CXPOP BXRET CROT ENDPCOV PROC;格式控制,使光标回到上个制表位PUSH AXPUSH CXPUSH DXMOV CX,08HMOV AH,02HMOV DL,08HREC:INT21HLOOP RECPOP DXPOP CXPOP AXRETCOV ENDPENT PROC;格式控制,输出回车换行MOV DL,0DHMOV AH,02HINT21HMOV DL,0AHMOV AH,02HINT21HRETENT ENDPMAIN ENDPCODE ENDSEND MAI五、程序调试及运行结果:主菜单1、功能一(小写字母转大写字母):2、功能二(找出ASCII码最大的字符):3、功能三(按ASCII码把字符从大到小排列):4、功能四(显示跳动的时间):5、功能五(退出程序):如果是错误的输入,提示如下:六、实验心得通过这个实验,基本掌握了子程序的调用方法,子程序可以单独设计,主程序做好了,可以嵌套具体功能的子程序实现需求,这个实验子程序可以分开调试,子程序决定具体功能,主程序是一个框架,这点有种化大为小的思想,告诉我们一个复杂功能的程序,可以分模块,按功能,一部分一部分地实现,最后嵌套,进行最后调试。
微机原理:顺序、分支、循环、子程序设计

[公司名称]实验二顺序、分支、循环、子程序设计微机原理上机实验JonMMx 2000[日期]预习报告零、相关知识1,LEA指令和MOV指令的区别一、顺序结构计算m*n-w,最终结果保存在AX其中m=12, n=12, w=4最终结果为AX=008CH=140Dname "sequence strcture"org 100hMOV AX, 1000HMOV DS, AXMOV SI, 1000HMOV [SI], 12MOV [SI+1], 12MOV [SI+2], 4MOV AL, [SI]MOV BL, [SI+1]MUL BLMOV BX, 0MOV BL, [SI+2]SUB AX, BXHLT二、分支结构在DS数据段偏移地址为DATA开始的顺序80个单元中,存放着某班80个同学的微机原理考试成绩。
现欲编程序统计>=90、89~70、69~60和<60分的人数,并将统计的结果存放在当前数据段偏移地址为BUFFER的顺序单元中name “branch structure”START:MOV DX, 0000HMOV BX, 0000HMOV CX, 80LEA SI, DATALEA DI, BUFFERGOON:MOV AL, [SI]CMP AL, 90JC NEXT3INC DHJMP STORNEXT3:CMP AL, 70JC NEXT5INC DLJMP STOR NEXT5:CMP AL, 60JC NEXT7INC BHJMP STOR NEXT7:INC BL STOR:INC SILOOP GOON MOV [DI], DH MOV [DI+1], DL MOV [DI+2], BH MOV [DI+3], BL HLT三、循环结构在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数。
现欲编程序将这100个数按大小顺序排序(以下程序使用的是快速排序算法,也可以使用冒泡排序,嵌套两层循环)name “circle structure”LEA DI, BUFFERMOV BL, 99NEXT0:MOV SI, DIMOV CL, BLNEXT3:MOV AX, [SI]ADD, SI, 2CMP AX, [SI]JNC NEXT 5MOV DX, [SI]MOV [SI-2], DXMOV [SI], AXNEXT5:DEC CLJNZ NEXT3DEC BLJNZ NEXT0HLT四、子程序编写程序,完成将一组BCD数转换成16位二进制数。
第6章 子程序结构

Lea dx,string地址 地址(IP) 地址 Num string地址 地址
2010-12-28 ch6
从键盘取得十进制 保存到BX BX中 数,保存到BX中 显示回车和换行 用十六进制形式 显示BX BX中的数 显示BX中的数
7
计算机科学与技术系
《汇编语言》 汇编语言》
Decihex
segment
assume cs:Decihex Main proc far Repeat: push ds xor ax, ax push ax call decibin call crlf call binihex call crlf ret Main endp
通过堆栈传递地址或参数
计算机科学与技术系
《汇编语言》 汇编语言》
Binhex proc near push bp mov bp,sp push ax push di push bx push cx pushf mov ax, [bp+4] mov di, [bp+6] mov ch, 4 mov cl, 4 roat: rol ax ,cl mov bl, al and bl, 0fh add bl, 30h cmp bl, 39h jle next add bl, 7h 2010-12-28
;每次乘的 每次乘的
;结果在 中 结果在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 Print: mov ah, 2 int 21h dec ch jnz rotate ret 2010-12-28 Binihex endp
微机实验--子程序设计

微机实验三分支和循环程序设计实验一、分支程序设计实验1.实验目的1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备微机一台3.内容设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:结果:在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6ORG 3510HNEW_LOC DB 20 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSLEA DI,NEW_LOCMOV CX,6CLD ;DF置0CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSBNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
(完整word版)微机原理完整实验报告+程序

实验题目8253定时/计数器实验 一、 实验目的与要求: 1. 学会8253芯片和微机接口原理和方法。
2. 掌握8253定时器/计数器的工作方式和编程原理。
二、 实验内容: 1、实验原理 本实验原理图如图 1所示,8253A 的A0、A1接系统地址总线 A0、A1,故8253A 本实验通道2 有四个端口地址,如端口地址表 1所示。
8253A 的片选地址为 48H~ 4FH 。
因此, 仪中的8253A 四个端口地址为 48H 、49H 、4AH 、4BH ,分别对应通道 0、通道1、 和控制字。
采用8253A 通道0,工作在方式3(方波发生器方式),输入时钟CLK0为 输出OUTO 要求为1KHZ 的方波,并要求用接在 GATE0引脚上的导线是接地("0" 甩空("1"电平)来观察GATE 对计数器的控制作用,用示波器观察输出波形。
2、实验线路连接 (1) 8253A 芯片的CLK0引出插孔连分频输出插孔 (2) 8253A 的 GATE0 接+5V 。
实验步骤 (1) 按图1连好实验线路(2) 运行实验程序 1. 按“调试”按钮2. 选“窗口” “进入示波器窗口” ,然后最小化3. 按“运行按钮”4.将模拟示波器窗口打开,选择“串行口 2”,再按 Ctrl + F2按钮即可看到波形 显示“ 8253-1 ”用示波器测量8253A 的OUT2输出插孔,方波输出,幅值0〜4V 三、实验代码: 1MHZ ,电平)或 3、 CODE SEGMENT ASSUME CS:CODE TCONTRO EQU 004BH TCON2 EQU 004AH CONT PORT EQU 00DFH DATA PORT EQU 00DEH DATA1 EQU 0500H START: JMP TCONT TCONT: CALL FORMATCALL LEDDIS P MOV DX,TCONTRO1MHZ 。
[汇编]子程序结构
![[汇编]子程序结构](https://img.taocdn.com/s3/m/e493393b58eef8c75fbfc77da26925c52dc59146.png)
[汇编]子程序结构子程序又称为过程,相当于高级语言中的过程和函数。
在一个程序的不同部分,往往要用到"类似"的程序段,即这些程序段的功能和结构形式都相同,只是某些变量赋值不同。
此时就可以把这些程序段写成子程序形式,以便需要时调用它。
有些程序段对于某个用户可能只用到一次,但它是一般用户经常用到的,如十进制数转换成二进制数,二进制数转换为十六进制数并显示输出等。
对于这些常用的特定功能的程序段,经常编制成子程序供用户使用。
此外,子程序结构还是模块化程序设计的重要工具,后面将介绍模块化程序设计方法。
1 过程定义伪操作过程定义伪操作用在过程(子程序)的前后,使整个过程形成清晰的、具有特定功能的代码块。
其格式为:procedure name PROC Attribute……procedure name ENDP其中过程名为标识符,它又是子程序入口的符号地址,与标号的作用相同。
属性(Attribute)是指类型属性,可以是NEAR或FAR。
用户对过程属性的确定原则很简单,即:(1)如果调用程序和过程在同一个代码段中,则使用NEAR属性。
(2)如果调用程序和过程不在同一个代码段中,则使用FAR属性。
2 子程序的调用和返回子程序的正确调用和正确返回可以保证过程的正确执行,这一功能由8086的CALL和RET指令完成。
为保证其正确性,除PROC的属性要正确选择外,还应该注意子程序运行期间的堆栈状态。
由于CALL时已使返回地址入栈,所以RET时应该使返回地址出栈。
如果子程序中不能正确使用堆栈而造成执行RET前SP并未指向进入子程序时的返回地址,则必然会导致运行出错,因此子程序中对堆栈的使用应该特别小心,以免发生错误。
3 保存与恢复寄存器由于调用程序(又称主程序)和子程序经常是分别编制的,所以它们所使用的寄存器往往会发生冲突。
如果主程序在调用子程序之前的某个寄存器内容在从子程序返回后还有用,而子程序又恰好使用了同一个寄存器,这就破坏了该寄存器的原有内容,因而会造成程序运行错误,这是不允许的。
机械_微机原理_学生实验报告

实验一汇编语言上机认识实验一、实验主要内容1、汇编语言源程序文件的建立;2、汇编程序的编辑、汇编、连接、运行。
二、实验目的熟悉汇编语言的上机环境,掌握汇编程序的编辑、汇编、连接、运行等步骤。
三、实验具体操作过程汇编语言的上机的一般步骤为:编辑(用编辑程序形成汇编语言源程序)、汇编(用汇编程序将源文件汇编成目标文件)、连接(用连接程序将目标程序转换为可执行文件)、调试运行(执行可执行性文件,若有错误,利用DEBUG调试程序进行调试,直到没有错误为止)。
1、进入DOS系统单击windows的“开始”按钮,再单击“运行”命令,输入“cmd”命令,进入DOS模式。
再利用相应的DOS命令,切换到masm目录下。
2、编辑.asm源程序在DOS提示符下输入“edit 001.asm”,建立一个汇编源程序文件,本次实验的程序是在屏幕上输出一个字符串“This is a sample program!”,具体程序如下:DA TA SEGMENTBUF DB 'THIS IS A SAMPLE PROGRAM!'DB 0DH,0AH,'$'DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DA TAMOV DS,AXMOV AH,9LEA DX,BUFINT 21HMOV AH,4CHINT 21HCODE ENDSEND START3、汇编在dos提示符下输入命令“masm 001.asm”,若发现有语法错误,请回到源程序进行修改;若无错误,进行下一步。
4、连接在dos提示符下输入命令“link 001.obj”。
5、运行在dos提示符下输入命令“001”,发现屏幕上输出“This is a sample program!”,实验完成。
实验二 DEBUG的应用一、实验主要内容1、进入和退出DEBUG程序2、使用DEBUG中的常用命令二、实验目的1、熟悉DEBUG有关命令的使用方法2、学会利用DEBUG掌握有关指令的功能3、学会利用DEBUG运行简单的程序段三、实验具体操作过程1、debug的启动与退出在dos提示符下输入“debug”,并回车,可进入debug状态;在debug提示符下输入“q”,可返回dos提示符。
第4章子程序结构

汇编语言程序设计
MAIN
计算机系统教研室张洁
8086计算机组织 第2章 8086计算机组织
子程序应用举例
【例 5.1】将一个给定的二进制数按位转换 】 成相应的ASCII码字符串 , 送到指定的存 码字符串, 成相应的 码字符串 储单元并显示。如二进制数10010011转 储单元并显示。如二进制数 转 换成字符串为‘ 换成字符串为‘10010011’。要求将转换 。 过程写成子程序, 过程写成子程序 , 且子程序应具有较好的 通用性, 而必须能实现对8倍和 倍和16倍二进 通用性 , 而必须能实现对 倍和 倍二进 制数的转换。 制数的转换。
汇编语言程序设计
计算机系统教研室张洁
8086计算机组织 第2章 8086计算机组织
汇编语言程序设计
计算机系统教研室张洁
8086计算机组织 第2章 8086计算机组织
【例】计算5!, RESULT是保存阶乘的存储单元。 计算 ! 是保存阶乘的存储单元 DATA SEGMENT N DW 5 RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA : , : START: MOV AX,DATA : , MOV DS,AX , MOV AX,N , CALL FACT
汇编语言程序设计 计算机系统教研室张洁
8086计算机组织 第2章 8086计算机组织
RET 指令 返回类型 格 式 操 作
IP出栈
段内:
RET RET exp
① IP出栈 ② SP ← SP + exp ① IP出栈 ② CS出栈 ① IP出栈 ② CS出栈 ③ SP ← SP + exp
段间 :
N E A R 子 程 序 书 写 形 式
- 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。