5_宏指令及子程序设计实验
宏程序编程实例与技巧方法
宏程序编程实例与技巧方法概述宏程序是一种程序设计技术,它可以帮助程序员更高效地编写代码。
宏程序可以在代码中定义一系列指令,然后在需要的时候通过宏调用来简化代码。
本文将介绍宏程序编程的一些实例以及一些技巧方法,帮助读者更好地理解和应用宏程序。
宏程序的使用场景宏程序常常用于编写重复性高的代码,例如循环结构、条件判断等。
通过宏程序,可以减少代码量,提高代码的可读性和维护性。
同时,宏程序还可以用来定义一些常用的功能模块,如计算、字符串操作等,以便在多个地方复用。
宏的定义和调用在开始介绍宏程序编程的实例之前,我们先来了解一下宏的定义和调用。
在大多数编程语言中,宏的定义是通过使用特定的关键字或语法来定义的。
一旦定义了宏,就可以通过宏调用来使用它。
下面是一个简单的示例,展示了如何定义和调用一个简单的宏:// 定义一个宏#define MAX(a, b) ((a) > (b) ? (a) : (b))// 使用宏int maxNum = MAX(10, 20);在上面的示例中,我们定义了一个名为MAX的宏。
这个宏接受两个参数a和b,并返回它们中较大的一个。
在使用宏的时候,我们直接使用MAX(10, 20)来调用它。
宏编程的实例实例一:计算平方有时候,我们需要计算一个数的平方。
下面是一个使用宏实现计算平方的例子:// 定义一个宏#define SQUARE(x) ((x) * (x))// 使用宏int squareNum = SQUARE(5); // squareNum 的值为25在上面的例子中,我们定义了一个名为SQUARE 的宏,它接受一个参数x,并返回x的平方。
在使用宏的时候,我们直接使用SQUARE(5)来调用它,得到结果25。
实例二:计算阶乘下面是一个使用宏实现计算阶乘的例子:// 定义一个宏#define FACTORIAL(n) ((n == 0) ? 1 : (n * FACTORIAL(n - 1)))// 使用宏int factorialNum = FACTORIAL(5); // factorialNum的值为120在上面的例子中,我们定义了一个名为FACTORIAL的宏,它接受一个参数n,并返回n的阶乘。
微机原理实验--子程序与宏指令
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 截图如下:。
汇编实验报告--子程序设计实验
实验五子程序设计实验学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二、实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
五、主要实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
六.实验结果:七.心得体会了解了把BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码源代码:.MODEL SMALL.336.STACK 200H.DA TAAS CV AL DB ‘12345’BINV AL DW ?.CODEMAIN PROCSTART:MOV AX,@DA TAMOV DS,AXLEA BX ASCV ALPUSH BXLEA BX,BINV ALPUSH BXCALL CONV ASCBINMOV AX,4C00HINT 21HMAIN ENDPCONV ASCBIN PROCPUSH BPMOV BP,SPADD SP AXPUSH AXPUSH BXPUSH CXPUSH SIPUSH DIMOV BX,0AHMOV SI,[BP+6]MOV DI,[BP+4]SUB DI,SIMOV [BP-2],DIMOV CX,[BP-2]ADD SI,[BP-2]DEC SIMOV WORDE PTR[BP-4],0001MOV DI,[BP+4]MOV WORD PTR[DI],0 NEXT:MOV AL,[SI]AND AX,000FHMUL WORD PTR[BP-4]ADD [DI],AXMOV AX,[BP-4]MUL BXMOV [BP-4],AXDEC SILOOP NEXTPOP DIPOP SIPOP CXPOP BXPOP AXMOV SP,BPPOP BPRET 0004CONV ASCBIN ENDPEND MAIN。
子程序设计实验报告简版修正
子程序设计实验报告1. 实验目的本实验旨在通过设计子程序,巩固和提升学生对于子程序设计的理解和运用能力,培养学生的逻辑思维和程序设计能力。
2. 实验内容2.1 设计一个子程序,实现两个数相加的功能。
2.2 设计一个子程序,实现两个数相乘的功能。
2.3 设计一个子程序,实现对一个数的平方根的计算。
3. 实验步骤3.1 子程序1:实现两个数相加assemblyadd_numbers:; 输入:寄存器R1和R2分别存放两个待相加的数; 输出:寄存器R0存放相加结果; 保存现场PUSH R1PUSH R2; 执行相加操作ADD R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.2 子程序2:实现两个数相乘assemblymultiply_numbers:; 输入:寄存器R1和R2分别存放两个待相乘的数 ; 输出:寄存器R0存放相乘结果; 保存现场PUSH R1PUSH R2; 执行相乘操作MUL R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.3 子程序3:实现对一个数的平方根的计算assemblycalculate_sqrt:; 输入:寄存器R1存放待计算平方根的数 ; 输出:寄存器R0存放计算结果; 保存现场PUSH R1PUSH R0; 初始化结果为0XOR R0, R0; 循环计算平方根LDR R2, 1 ; 设定计算误差精度为1 sqrt_loop:; 比较结果的平方与待计算数的大小MUL R3, R0, R0CMP R3, R1; 结果满足精度要求,跳出循环BHI sqrt_done; 调整结果ADD R0, R0, R2; 继续循环B sqrt_loopsqrt_done:; 恢复现场POP R0POP R1; 返回RET4. 实验结果和分析经过上述子程序的设计和实现,我们实现了两个数相加、两个数相乘、以及一个数的平方根的计算功能。
汇编实验4-宏指令设计-实验报告10页word文档
昆明理工大学信息工程与自动化学院学生实验报告( 2019 — 2019 学年第 1 学期)课程名称:汇编与微机接口开课实验室:信自楼机房445 2019年10月21日年级、专业、班学号姓名成绩实验项目名称宏指令设计指导教师教师评语该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□该同学的实验能力: A.强□ B.中等□ C.差□该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□实验报告是否规范: A.规范□ B.基本规范□ C.不规范□实验过程是否详细记录: A.详细□ B.一般□ C.没有□教师签名:年月日一、实验目的和内容1. 掌握宏指令库的设计方法,并设计程序来调用其中的宏指令。
2. 编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现。
二、实验原理及基本技术路线图(方框原理图)宏指令是源程序中一段有独立功能的程序代码。
宏指令由宏定义伪指令定义,它只需在源程序中定义一次,便可以多次被调用。
当源程序被汇编时,汇编程序对每个宏调用进行宏扩展。
宏扩展就是用宏定义体替换宏指令名,并用实参数替换形式参数。
宏调用中实参数个数和形式参数个数不等时,若实参数个数大于形式参数个数,在替换时多余的实参数不予考虑;若实参数个数小于形式参数个数,则多余的形式参数作为空(字符)或零(数字)处理。
应保证用实参数替换形式参数后,所展开的是有效的汇编语句,否则汇编程序会提示错误。
为了使宏指令能让多个程序共享,可以把它们组织到一个文件中,并存放在磁盘上,把这种文件称为宏指令库。
可以用EDIT 等任何文本编辑程序创建宏指令库,库名由用户自己起,而且对库的扩展名没有特殊要求。
库中的宏指令以源代码形式出现。
三、所用仪器、材料(设备名称、型号、规格等)1. 操作系统平台:Windows 7。
2. 汇编环境:Microsoft MASM 5.0。
3. 文本编辑器:记事本。
任务5 使用宏指令编程的配合零件加工与操作华中数控
二、实训知识准备
勤 学
(二)宏程序编程
苦 应用举例
练 当#1和#2相等,或#3 和#4相等时,将0赋
值给#3,否则将1赋值给#3。
技 IF[#1EQ#2]OR[#3EQ#4] 能 #3=0 报 ELSE 国 #3=1
ENDIF
当#1和#2相等,并且#3和#4相等时, 将0赋值给#3。 IF [#1 EQ #2] AND [#3 EQ #4] #3=0 ENDIF
2233
三、方案设计
勤
学
(一)零件图样分析
苦
本零件为具有非圆曲线的零件配合件,零件要求较高的部位是
练 φ53mm、φ44mm,均有公差要求;椭圆及其他外圆表面粗糙度为
Ra1.6μm。因此,必须安排精车,以达到图样要求。
技 能 报 国
2244
三、方案设计
2.制定加工方案
勤 学 加工顺序安排如下:
苦 (1)使用端面车刀车削配合件1左端端面。(手动车削) 练
(三)椭圆编程思路
苦 用直线插补逼近非圆曲线
练
当 Zi=0,求出Xi=0
Zi=-0.1时,利用X表达式求出新的Xi=0.816
技
Zi=-0.2时,利用X表达式求出新的Xi=1.155
能
…….
报
Zi=-15时,利用X表达式求出新的Xi=10
国
通过运行G01 Xi_Zi_实现用直线段逼近非圆
曲线方法完成。
国
G02 X25Z25 R25
G00 G40 X10 Z10 取消刀具补偿
图1-45刀尖方位代码
99
二、实训知识准备
勤 学
(二)宏程序编程
苦 1.宏程序的概念
宏的创建实验报告(3篇)
第1篇一、实验目的1. 理解宏的概念及其在编程中的作用。
2. 掌握宏的创建方法,包括条件宏、无参数宏和带参数宏。
3. 熟悉宏的使用技巧,提高编程效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 宏的概念宏是一种在编译预处理阶段对源代码进行替换的技术。
它可以将一段代码替换为一个简单的标识符,从而提高编程效率。
2. 宏的创建(1)条件宏条件宏允许根据特定的条件编译不同的代码。
其语法如下:```cppifdef 条件标识符// 条件成立时编译的代码else// 条件不成立时编译的代码endif```(2)无参数宏无参数宏是一种简单的宏,它只包含一个标识符。
其语法如下:```cppdefine 宏名替换后的代码```(3)带参数宏带参数宏允许在宏中使用参数,从而实现更灵活的代码替换。
其语法如下:```cppdefine 宏名(参数1, 参数2, ...) 替换后的代码```3. 宏的使用技巧(1)避免使用宏进行复杂的逻辑运算,以免降低代码的可读性。
(2)合理使用条件宏,避免不必要的代码编译。
(3)合理使用带参数宏,提高代码的复用性。
四、实验步骤1. 创建一个名为“MacroTest.cpp”的C++源文件。
2. 在文件中编写以下代码:```cppinclude <iostream>// 条件宏ifdef DEBUGdefine LOG(msg) std::cout << "DEBUG: " << msg << std::endl elsedefine LOG(msg)endif// 无参数宏define PI 3.1415926// 带参数宏define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {// 使用条件宏LOG("This is a debug message");// 使用无参数宏std::cout << "The value of PI is: " << PI << std::endl;// 使用带参数宏std::cout << "The maximum value is: " << MAX(3, 5) << std::endl;return 0;}```3. 在Visual Studio 2019中编译并运行程序,观察输出结果。
汇编语言 宏汇编程序设计
昆明理工大学信息工程与自动化学院学生实验报告(2010 —2011 学年第 1 学期)课程名称:汇编语言程序设计开课实验室: 2010年 12 月 14 日年级、专业、班计科083 学号姓名成绩实验项目名称宏汇编指导教师教师评语教师签名:年月日一、实验要求宏指令设计1)掌握宏指令库的设计方法,并设计程序来调用其中的宏指令;2)编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现;3)观察并记录运行结果。
二、实验原理及基本技术路线图(方框原理图)使用debug进行调试。
源程序:INCLUDE MACRO.libPURGE SETMODE,INCHAR,OUTCHAR,WINDOW,MOVE,MULSTACKSG SEGMENT STACK 'S'DW 16 DUP('?')STACKSG ENDSDATA SEGMENTA DD 1234001B DW 1234C DW ?PROMPT DB 'The result is: $'ASCII DB 5 DUP(?),'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,WORD PTR A+2MOV AX,WORD PTR ADIV BBIN_DEC ASCII,AX CLRSCRNDISP PROMPTDISP ASCIIRETURNMAIN ENDPCODE ENDSEND MAIN附:宏库MACRO.libSETMODE MACROPUSH AXMOV AH, 0MOV AL, 3INT 10HPOP AXENDMINCHAR MACROPUSH AXMOV AH,1INT 21HPOP AXENDMOUTCHAR MACRO XPUSH DXPUSH AXMOV DL,XMOV AH,2INT 21HPOP AXPOP DXENDMPUSHREG MACROPUSH DXPUSH CXPUSH BXPUSH AXPUSH DIPUSH SIPUSH BPENDMPOPREG MACROPOP BPPOP SIPOP DIPOP AXPOP BXPOP CXPOP DXENDMWINDOW MACRO Collor,WleftTopRow,WLeftTopCul, WRightBottomRow,WRightBottomCulPUSHREGMOV AH ,6MOV AL ,0MOV BH ,CollorMOV CH ,WleftTopRowMOV CL ,WLeftTopCulMOV DH ,WRightBottomRowMOV DL ,WRightBottomCulINT 10HPOPREGENDMMOVE MACRO X,YPUSH AXMOV AX,XMOV Y,AXPOP AXENDMCLRSCRN MACROPUSHREGMOV AH,6MOV AL,0MOV BH,1FHMOV CX,0MOV DX,184FHINT 10HPOPREGENDMCURSOR MACROPUSH AXPUSH BXMOV AH,2XOR BH,BHINT 10HPOP BXPOP AXENDMMUL MACRO M1,M2PUSH AXPUSH BXPUSH DXMOV AX,M1MOV BX,M2MUL BXPOP DXPOP BXPOP AXENDMRETURN MACROPUSH AXMOV AX, 4C00HINT 21HPOP AXENDMBIN_DEC MACRO ASC,BIN LOCAL LOPLOCAL EXITPUSHREGLEA DI, ASC ADD DI, 5MOV AX, BIN MOV BX, 10 LOP: MOV DX, 0CMP AX, 0JE EXITDIV BXADD DL, 30HDEC DIMOV [DI],DLJMP LOPEXIT: POPREGENDMDISP MACRO ASCPUSH DSPUSH DXPUSH AXLEA DX, ASCMOV AH, 9INT 21HPOP AXPOP DXPOP DSENDM三、所用仪器、材料(设备名称、型号、规格等)Masm 6.0,debug。
宏设计实验报告
一、实验目的本次实验旨在通过设计和实现一个简单的宏单元,加深对宏设计原理的理解,掌握宏单元的设计流程,并学会使用FPGA开发工具进行硬件描述语言(HDL)编程和仿真。
二、实验原理宏设计是指将基本逻辑单元组合成复杂的逻辑功能,如加法器、乘法器等。
通过宏设计,可以将复杂的逻辑功能模块化,提高设计的可重用性和可维护性。
在FPGA 设计中,宏单元通常是指由HDL语言编写的逻辑模块。
三、实验器材1. FPGA开发板2. HDL开发工具(如Vivado、Quartus等)3. 仿真工具(如ModelSim等)4. 连接线四、实验步骤1. 需求分析根据实验要求,设计一个简单的宏单元,例如4位加法器。
2. 设计输入使用HDL语言编写4位加法器的模块代码。
```vhdllibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.NUMERIC_STD.ALL;entity adder4 isPort ( a : in STD_LOGIC_VECTOR(3 downto 0);b : in STD_LOGIC_VECTOR(3 downto 0);sum : out STD_LOGIC_VECTOR(4 downto 0));end adder4;architecture Behavioral of adder4 isbeginprocess(a, b)beginsum <= std_logic_vector(signed(a) + signed(b)); end process;end Behavioral;```3. 代码编译使用HDL开发工具将编写的代码编译成可综合的网表。
4. 仿真使用仿真工具对编译后的网表进行仿真,验证设计的正确性。
```vhdllibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.NUMERIC_STD.ALL;entity testbench isend testbench;architecture Behavioral of testbench issignal a : STD_LOGIC_VECTOR(3 downto 0);signal b : STD_LOGIC_VECTOR(3 downto 0);signal sum : STD_LOGIC_VECTOR(4 downto 0);beginuut: entity work.adder4port map (a => a,b => b,sum => sum);stimulus: processbegina <= "0001";b <= "0010";wait for 10 ns;a <= "1100";b <= "1010";wait for 10 ns;a <= "1111";b <= "1111";wait for 10 ns;a <= "0000";b <= "0000";wait for 10 ns;report "Simulation complete" severity note;wait;end process;end Behavioral;```5. 综合与布局布线使用FPGA开发工具将仿真通过的网表进行综合和布局布线,生成比特流文件。
5.4 子程序设计和宏
宏的使用步骤
mainbegin MACRO datasn mov ax, datasn mov ds,ax ENDM mainend MACRO mov ah,4ch int 21h ENDM Dispmsg MACRO stringad mov dx,stringad mov ah,9 int 21h ENDM
mainend
Dispmsg
宏调用
格式:
start: mainbegin data dispmsg string mainend end start
宏名 [实参表]
;宏调用,建立DS内容 ;宏调用,显示字符串 ;宏调用,返回DOS
宏调用的实质是在汇编过程中用宏代替宏 所表示的程序段,并用实际参数代替形式参 数,相当于子程序中的子程序调用。
宏展 开
start: 1 1
宏展开——在汇编时,用宏定义体的代码序列 替代宏指令的过程。
mainbegin data mov ax,data mov ds,ax
;宏指令 ;宏展开
1 1 1
dispmsg string mov dx,offset string mov ah,9 int 21h mainend mov ah,4ch int 21h
;过程中使用了AX、CX和DX
; ; ;
;是0Ah~0Fh,还要加上7
aldisp1:
mov ah,2 ;显示 int 21h dec ch ; jne lop1 ; pop dx pop cx pop ax ret ;过程返回 disbx16 endp code ends end start
宏指令应用程序设计实验程序设计实验报告 _20141211
实验六宏指令运用程序设计实验学号:41210038姓名:罗天继一、实验目的:1、复习掌握:宏定义,宏调用,宏展开概念;2、练习掌握:宏指令在汇编程序中的应用方法;3、学习掌握:宏库的概念,学会制作宏库文件的技术;4、学习掌握:在汇编程序中引用宏库的编程技术;5、学习掌握:宏操作符的概念,在汇编程序中的应用技术;6、讨论掌握:宏在汇编程序设计中的地位与作用。
二、实验内容:实验1:1、编写一个将AX中数据乘以10的宏MULTAX10,并编制一个程序SY6_1.ASM调用MULTAX10,且调试运行,验证其功能的实现情况;源文件SY6_1.asm文件内容:.286 ;保留MULTAX10 MACROPUSH BXSAL AX , 1MOV BX , AXSAL AX , 1SAL AX , 1ADD AX , BXPOP BXENDMDATA SEGMENT ;保留;填入内容DATA ENDS ;保留STACK1 SEGMENT PARA STACK ;保留DW 20H DUP(0) ;保留STACK1 ENDS ;保留CODE SEGMENT ;保留ASSUME CS:CODE,DS:DATA,SS:STACK1 ;保留START: MOV AX,DATA ;保留MOV DS,AX ;保留MOV AX , 01HMULTAX10;填入内容MOV AX,4C00H ;保留INT 21H ;保留CODE ENDS ;保留END START ;保留编译源文件“SY6_1.asm”生成可执行文件“Debug SY6_1.exe”SY6_1.ini文件内容:u 0,1Ed 2867:0,1fg=0,14d 2867:0,1fqSY6_1.bat文件内容:Debug sy6_1.exe < sy6_1.ini> > sy6_1.txt 执行SY6_1.bat文件后可以获得SY6_1.txt文件;SY6_1.txt文件内容:-u 0,1E2867:0000 B86328 MOV AX,28632867:0003 8ED8 MOV DS,AX2867:0005 B80100 MOV AX,00012867:0008 53 PUSH BX2867:0009 D1E0 SHL AX,12867:000B 8BD8 MOV BX,AX2867:000D D1E0 SHL AX,12867:000F D1E0 SHL AX,12867:0011 03C3 ADD AX,BX2867:0013 5B POP BX2867:0014 CD21 INT 212867:0016 22CB AND CL,BL2867:0018 40 INC AX2867:0019 AF SCASW2867:001A 21CB AND BX,CX2867:001C 40 INC AX2867:001D AF SCASW2867:001E 21CB AND BX,CX-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S....... 2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-g=0,14AX=000A BX=0000 CX=0056 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=2863 ES=2853 SS=2863 CS=2867 IP=0014 NV UP EI PL NZ NA PE NC 2867:0014 CD21 INT 21-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S.......2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-q显然,上面忠实地记录了内存的情况并且展示了实验结果。
罗辛汇编实验
实验六子程序和宏汇编的程序设计一. 实验目的:1、掌握子程序设计和调试方法,包括:1) 掌握主程序与子程序之间的调用关系及其调用方法;2) 掌握子程序调用过程中近程调用与远程调用的区别;2、掌握DOS调用功能的输入输出设计方法3、掌握大小转换的设计方法4、掌握十进制数的计算设计方法二. 实验要求:1、掌握子程序设计方法,包括:1) 子程序间参数简单传递方法2) 利用堆栈传递方法3) 子程序的递归2、基于DOS调用的输入输出方法,包括:1) 单个字符的输出方法2) 字符串的输出方法3) 字符的输入方法三. 实验内容:1.控制台输入输出(1) 字符的输出向显示器输出信息有三种方法:▪通过操作系统的服务程序(INT 21H)输出;▪通过“基本输入输出系统(BIOS)”输出;▪把显示内容(ASCII码)直接写入“显示存储器(Video RAM,VRAM)”,由显示器接口电路转换输出这里实验通过操作系统的服务程序(INT 21H)输出。
①输出单个字符例:下面的程序在显示器上输出数字字符“9”:字符“9”显示在光标(Cursor)位置, 光标向右移动一个字符位置。
问题:X为DB定义的一个变量,下面的程序能够输出X的值吗?MOV AH, 2 ;功能号02H装入AH寄存器MOV DL, X ;变量X的值装入DL寄存器INT 21H ;调用21H号系统服务程序练习1:在显示器上输出文字“Hello !”参考程序:CODE SEGMENTASSUME CS: CODESTART: LEA BX, STRINGMOV CX, 11ONE: MOV DL, CS: [BX] ;取出一个字符的ASCII代码MOV AH, 2 ;单个字符输出的功能号NT 21H ;调用系统服务,输出一个字符INC BX ;修改指针LOOP ONE ;计数与循环控制MOV AX, 4C00HINT 21HSTRING DB 0DH, 0AH, ‘Hello !’, 0DH, 0AHCODE ENDSEND START说明:STRING在代码段里定义,取字符需要增加段跨越前缀“CS: [BX]”,否则会到“DS: [BX]”处取字符,输出不确定的内容。
Ch06 子程序与宏指令设计
6.1.1 含有子程序的程序结构 在汇编语言中用过程定义伪指令定 义子程序。过程定义伪指令格式: 过程名 PROC 属型 … 过程名 ENDP
1.调用程序和子程序在同一个代码段的程 序结构(子程序类型可缺省,注意END后必须
跟主程序名)
CODE MAIN SEGMENT PROC FAR … CALL SUB1 RET ENDP PROC … RET ENDP ENDS END MAIN
;二→十并显示。
;转换万位数 ;转换千位数
;转换百位数
;转换十位数 ;转换个位数
DEC_DIV
DEC_DIV CODE
PROC ;CX中为十进制的位权 MOV AX,BX MOV DX,0 DIV CX ;商为转换后的一位十进制数 MOV BX,DX MOV DL,AL ADD DL,30H ;转换成ASCII码 MOV AH,2 ;显示 INT 21H RET ENDP ENDS END MAIN
MAIN CODE1 CODE2 SUB1
SUB1 SUB2
SUB2 CODE2
6.1.2 设计子程序时应注意的问题 1.子程序说明 2.寄存器的保存与恢复 3.密切注意堆栈状态
6.2
子程序参数传递
可以通过给子程序传递参数使其更 通用。常用的参数传递方法如下:通过 寄存器传递;若调用程序和子程序在同 模块(源程序)中,子程序可以直接访 问模块中的变量;通过地址表传递参数 地址;通过堆栈传递参数或参数地址。
ADD AX,[SI] ;累加和 ADD SI,TYPE ARY ;修改地址指针 LOOP NEXT MOV SUM,AX ;存和 POP SI ;恢复寄存器 POP CX POP AX RET ENDP ENDS END MAIN
汇编语言程序设计实验报告三(子程序设计实验)
汇编语言程序设计实验报告三(子程序设计实验)汇编语言程序设计实验报告三(子程序设计实验)实验目的掌握主程序与子程序之间的调用关系及其调用方法。
掌握子程序调用过程中近程调用与远程调用的区别。
熟练掌握码型变换的程序。
实验内容从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制数,并在屏幕上显示。
要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。
数据可循环输入,遇‘00’结束。
实验准备预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。
熟悉键盘输入和字符显示的程序段的编制。
实验步骤编辑、汇编源程序,生成可执行文件。
执行程序,检查输入、输出结果,看是否正确。
如不正确,用DEBUG检查,修改源程序,再汇编、运行,直到程序正确为止。
用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆栈的变化情况。
实验报告要求分析近程调用和远程调用的主要区别。
用DEBUG命令观察执行过程有何不同。
分析实验结果及所遇到的问题的解决方法。
程序流程图开始TRAN程序标准序开始读入十进制数据放AX中AXAXAND0F0FH是00?YBLALN调用转换子程序结束AL左移3位回车、换行BL左移1位于ALAL+BL主程序流程图ALAL+AHRET转换子程序TRAN流程图程序清单STASEGMENTSTACK’STACK’DB100DUP(0)STAENDS GSAGSEGMENTPARA‘CODE’ASSUMECS:CSAG MAINPROCFARSTRAT:PUSHDSSUBAX,AXPUSHAXREV:MOVAH,1INT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030H JEENDTRAN CALLNEARPTRTRAN CALLFARPTRCON MOVAL,0DH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP JMPREV ENDTRAN:RET MAINENDP TRANPROCNEAR ANDAX,0F0FHMOVBL,ALMOVBL,ALMOVCL,3SHLAL,CLMOVCL,1SHLBL,CLADDAL,BLADDAL,AHRETTRANENDPCSAGENDS CSBGSEGMENTPARA’CODE’ASSUMECS:CSBG CONPROCFARPUSHAXMOVCL,4 SHRAL,CL ADDAL,30H CMPAL,39H JBECON2 ADDAL,7CON2:PUSHAX MOVAL,0DH CALLFARPTRDISP MOVAL,OAH CALLFARPTRDISP POPAX CALLFARPTRDISP POPAX ANDAL,0FHADDAL,30H CMPAL,39H JBECON1ADDAL,7CON1:CALLFARPTRDISP RETCONEDNP DISPPROCFAR PUSHBXMOVBX,0MOVAH,14INT10HPOPBXRETDISPENDPCSBGENDS ENDSTART。
宏及过程调用实验报告
子程序及宏的使用实验报告一、实验目的1、练习使用子程序和宏;2、练习使用功能调用(INT 21H)中关于字符输入及字符输出部分。
二、实验准备1、事先编写实验内容的汇编源程序2、用ORG确定数据在内存中的偏移地址三、实验内容1、从键盘输入10个一位或两位的十进制数,用压缩BCD码形式存入数据段1000H起的内存单元中,且每个数在屏幕上显示成一行,共10行2、编程从上面十个数中找出最大值,显示在屏幕上。
3、选作内容:将十个数按从大到小的顺序排列在数据区中程序设计如下:NAME EXP ;程序名称DATA SEGMENT ;数据段MESS DB 'INPUT 10 DECIMAL NUMBER:', 0DH,0AH,'$' ;提示输入10个十进制数字ERROR1 DB 0DH,0AH,'NOT DECIMAL NUMBER!',0DH,0AH,'$' ;错误提示一:输入的不是数字ERROR2 DB 0DH,0AH,'TOO LARGE DECIMAL NUMBER!',0DH,0AH,'$' ;错误提示二:输入的数字太大(三位数)MESS1 DB 0DH,0AH,'INPUTED NUMBER:',0DH,0AH,'$' ;输出提示一:输出输入的十个数字MESS2 DB 'THE LARGEST NUMBER:',0DH,0AH,'$' ;输出提示二:输出最大数字MESS3 DB 0DH,0AH,'SORTED NUMBER:',0DH,0AH,'$' ;输出提示三:输出排序后的十个数字ORG 1000H ;将十个数字的开始偏移地址设为1000HNUBLIST DB 10 DUP(?) ;数字列表LARGEST DB ? ;存储最大数字DATA ENDSSTACK SEGMENT STACK ;堆栈段DB 1000 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATAEXP PROC FAR ;将程序定义成远过程START: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,NUBLISTCALL MS ;显示输入提示MOV CL,10NEXT: XOR AX,AXCALL INP ;调用接收字符子程序JNZ NEXTMOV AH,9MOV DX,OFFSET MESS1 ;输出提示一:顺序输出输入的十个数字INT 21HLEA SI,NUBLISTMOV CH,10LOK: CALL LOOK ;输出一个数字INC SIDEC CHJNZ LOKMOV AH,9MOV DX,OFFSET MESS2 ;输出提示二:输出最大数字INT 21HCALL MAXMOV AH,9MOV DX,OFFSET MESS3 ;输出提示三:输出排序后的十个数字INT 21HCALL SORT ;进行排序LEA SI,NUBLISTMOV CH,10LOK1: CALL LOOK ;输出INC SIDEC CHJNZ LOK1MOV AH,4CH ;退出程序功能调用INT 21HMS PROC ;显示输入提示MOV AH,9MOV DX,OFFSET MESS ;输出输入提示INT 21HRETMS ENDPINP PROCHC: MOV AH,1 ;接收第一个字符INT 21HCMP AL,0DH ;检查是否直接回车JZ HCCMP AL,39H ;检查是否在数字范围内JA ER1CMP AL,30HJB ER1PUSH AXMOV AH,1 ;接收第二个字符INT 21HCMP AL,0DH ;检查是否回车JZ DEAL1 ;如果是,则进行一位数处理CMP AL,39H ;检查是否在数字范围内JA ER2CMP AL,30HJB ER2PUSH AXMOV AH,1 ;接收第三个字符INT 21HCMP AL,0DH ;检查是否回车JZ DEAL2 ;如果是,则进行两位数处理MOV AH,9 ;否则为三位数,输出错误提示二MOV DX,OFFSET ERROR2INT 21HPOP DXPOP DXJMP HCDEAL1: POP AX ;一位数处理SUB AL,30H ;将ASCII码转换成十进制数MOV [SI],AL ;移入数字列表中INC SIMOV AH,2H ;输出数字MOV DL,0AHINT 21HDEC CLJMP REDEAL2: POP AX ;两位数处理SUB AL,30H ;将个位ASCII码转换成十进制数POP BXSUB BL,30H ;将十位ASCII码转换成十进制数SHL BL,4 ;将十位左移四位ADD AL,BL ;将十位和个位相加MOV [SI],AL ;移入数字列表中INC SIMOV AH,2H ;输出数字MOV DL,0AHINT 21HDEC CLJMP REER1: CALL ERR1JMP HCER2: CALL ERR2JMP HCRE: RETINP ENDPERR1 PROC ;错误提示一:输入不是数字MOV AH,9MOV DX,OFFSET ERROR1INT 21HRETERR1 ENDPERR2 PROC ;错误提示二:输入数字太大MOV AH,9MOV DX,OFFSET ERROR1INT 21HPOP DXRETERR2 ENDPLOOK PROC ;输出一个数字MOV AL,[SI]MOV CL,4SHR AL,CLCALL DSP ;输出十位MOV AL,[SI]AND AL,0FHCALL DSP ;输出个位MOV DL,0DH ;回车MOV AH,2INT 21HMOV DL,0AH ;换行MOV AH,2INT 21HRETLOOK ENDPMAX PROC ;查找最大数字LEA SI,NUBLISTMOV CL,9HMOV AL,[SI] ;将当前最大数字存在AL中COMP: INC SIMOV BL,[SI] ;每次取一个数字,放入BL中CMP AL,BL ;将它和当前最大数字进行比较JA NCHX ;如果它较小,则不交换MOV AL,BL ;否则将它放入AL中成为新的最大数字NCHX: DEC CLJNZ COMPMOV LARGEST,AL ;存入最大数字单元中CALL OUTP ;输出最大数字RETMAX ENDPOUTP PROC ;输出最大数字MOV AL,LARGESTMOV CL,4SHR AL,CLCALL DSP ;输出十位MOV AL,LARGESTAND AL,0FHCALL DSP ;输出个位RETOUTP ENDPDSP PROC ;将十进制转换成ASCII码,以便输出ADD AL,30HMOV DL,ALMOV AH,2INT 21HRETDSP ENDPSORT PROC ;冒泡法排序LEA SI,NUBLISTMOV CL,9 ;总共进行九次大循环,每一次将最小的放到最后CSH: MOV CH,CLGSH: MOV AL,[SI] ;取相邻的两个数MOV BL,[SI+1]CMP AL,BL ;进行比较JA NCH ;如果前一个大,则不交换顺序MOV DL,BL ;否则交换两者的顺序MOV BL,ALMOV AL,DLMOV [SI],AL ;送回内存中MOV [SI+1],BLNCH: INC SIDEC CHJNZ GSHMOV AL,CLXOR AH,AHSUB SI,AX ;第二次大循环要从头开始比较DEC CLJNZ CSHRETSORT ENDPEXP ENDPCODE ENDSEND START反汇编结果(前几行),可以看到输入的十个数据存放的地址为0C28:1000H。
汇编语言试验指导
实验指导一.上机实验的一般步骤和要求:1.上机前对选定的实验题应有所了解,并写好程序。
2.上机过程中对重要方法和步骤、问题和结果应有记录。
3.所有程序原则上都要通过调试手段运行。
4.实验后进行分析和总结,给出实验报告。
二.实验报告的内容一般有:1.实验题的内容及要求。
2.思路和方法、算法描述及有注释和说明的程序清单。
3.程序调试和运行的重要步骤、问题和结果。
4.分析和总结。
三.实验环境的建立参看第二章第一节。
通常在WINDOWS XP系统下。
如果其他操作系统(如WIN 7),不支持汇编程序工作,可安装Masm for Windows集成实验环境asm20125(支持Win2000、WinXP、WinVISTA、WIN7等操作系统)。
/实验1 上机过程及程序调试实验目的:1.通过第二章两个简单实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用。
2.掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。
即编辑、汇编、连接。
了解汇编语言的系统工作文件和工作环境。
理解汇编程序和连接程序的作用。
理解列表文件内容。
3.初步了解程序的运行和调试方法。
学会使用DEBUG主要命令和常用的DOS命令。
实验内容:【1】编辑第二章两个简单实例,通过汇编、连接。
【2】用DEBUG对hello程序进行调试。
问题:(1) 该程序在内存中的起始地址是多少?结束地址是多少?共占几个字节?(2) 0B63:0008表示什么意思?(3) 程序中定义的串‘HELLO, WORLD !$’在内存中的起始地址是多少?请用DEBUG命令显示该串。
(4) 如果用带有断点的G命令运行该程序,写出命令。
(5) 用P命令单步执行程序。
(6) 用T命令跟踪程序,在跟踪执行INT 21时出现什么问题?(7) 用A命令在偏移地址100H处建立该段程序,并运行。
(8) 用W命令把该段程序写成文件,再调入。
实验2 算术及位串处理程序实验目的:掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用DEBUG。
5_宏指令及子程序设计实验
西安邮电学院微机原理实验报告题目:宏指令及子程序设计实验院系名称:计算机学院专业名称:计算机科学与技术班级: 0901学生姓名:马庆祥学号(8位): 04091009指导教师:王忠民2.5 宏令及子程序设计实验2.5.1 实验目的1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。
2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。
3、了解宏指令与子程序的异同以及各自的适用场合。
2.5.2 实验预习要求1、复习宏指令的定义与调用方法。
2、复习过子程序的定义与调用方法。
3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。
4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.5.3 实验内容从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM 字节型变量中,找出其中的最大数,并将找出的最大数在屏幕上显示出来。
要求:在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现;将键盘输入的十进制数转换成二进制数由子程序DTOB实现;在N个无符号字节型二进制数中找出最大数的功能由子程序FMAX实现;将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的功能由子程序BTOAD实现。
程序运行结果如右图所示。
1、编程指导(1)显示提示信息的宏指令DSTRING的编写宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。
这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。
读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。
下面给出实现提示信息显示的宏指令的定义:DSTRING MACRO STRINGPUSH DXPUSH AXMOV DX,OFFSET STRINGMOV AH,09HINT 21HPOP AXPOP DXENDM请读者注意,宏指令应该先定义,后调用。
汇编语言程序设计实验报告
班级 :
二、实验内容 求 1+2+3+4+5+6+7+8+9 的和,并将和显示在屏幕上; 具体要求: 1. 利用重复宏定义实现 1、2、39 数据的定义; 2. 将单个字符显示定义成宏,利用宏调用来实现和的显示。 3. 利用 PWB 集成环境完成程序的编辑、汇编及连接,并最终生成 COM 可执行文件。
二、实验内容 P131 作业 29。
实验三子Βιβλιοθήκη 序设计实验一、实验目的 1.掌握汇编语言源程序子程序设计方法; 2.会使用 CV 软件工具。
二、实验内容 把实验二作为子程序,编写主程序来对能否构成三角形进行 10 判断。
姓名:
汇编语言程序设计实 验报告
实验四
宏汇编程序设计实验
一、实验目的 1.掌握宏汇编程序编程技术及宏调用的方法; 2. 了解 COM 文件的编程方法及特点; 2.会使用 PWB 及 CV 软件工具。
实验五
混合程序的开发实验
一、实验目的 1.了解混合调用中的参数设置; 2. 掌握混合调用的方法;
姓名:
二、实验内容 P156 第 5 题。
汇编语言程序设计实 验报告
班级 :
姓名:
汇编语言程序设计实 验报告
实验一
单指令功能测试实验
一、实验目的 1.会使用 DEBUG 软件; 2.利用 DEBUG 单步执行功能测试指令的执行。
班级 :
二、实验内容 P129,14 题
实验二
完整的汇编语言程序设计实验
一、实验目的 1.掌握完整的汇编语言源程序的设计方法; 2.掌握汇编语言源程序的执行过程。
实验五
多模块程序设计实验
一、实验目的 1.掌握汇编段的属性的含义; 2. 掌握利用 LINK 将多模块连接起来的方法; 3.掌握利用库文件将多模块连接起来的方法。
东华汇编实验六
东华汇编实验六操作系统原理实验报告实验名称:子程序和宏汇编的程序设计姓名:学号:班级:计算机指导老师:一、实验内容(描述实验内容)1.控制台输入输出2.简单循环程序设计3.简单分支程序设计4.子程序设计5.课内完成实验6.课后补充实验二、实验目的(描述实验目的)1、掌握子程序设计和调试方法,包括:1) 掌握主程序与子程序之间的调用关系及其调用方法;2) 掌握子程序调用过程中近程调用与远程调用的区别;2、掌握DOS调用功能的输入输出设计方法3、掌握大小转换的设计方法4、掌握十进制数的计算设计方法三、实验原理(描述实验基本原理)利用编写汇编程序利用MASM编译汇编程序利用LINK连接汇编程序利用DEBUG调试汇编程序四、实验过程(重点部分,必须包括:实验开发环境、实验步骤、实验源程序代码及其结构分析)环境:Windows XP练习一:data segmentSTRING db 0dh,0ah,'Hello!',0dh,0ah ;初始化内存data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov bx,offset STRINGmov cx,11 ;循环次数ONE:mov dl,[bx]mov ah,2int 21h ;输出字母inc bxloop ONE ;循环mov ax,4c00hint 21hcode endsend start练习二:data segmentSTRING db 0dh,0ah,'Hello!',0dh,0ah,'$' ;初始化内存data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea dx,STRINGmov ah,9int 21h ;输出字符串mov ax,4c00hint 21hcode endsend start练习三:data segmentX db 10001101bC db 10 ;初始化内存data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,3 ;循环次数mov al,XONE:mov ah,0 ;高八位清零div Cpush ax ;余数压入栈loop ONEmov cx,3TWO:pop dxxchg dh,dl ;把余数交换到dlor dl,30hmov ah,2int 21h ;输出loop TWO ;继续循环mov ax,4c00hint 21hcode endsend startmov ah,2练习四:data segmentY dw 0100101010110111BC dw 16hex db '0123456789ABCDEF' ;初始化内存data endscode segmentassume ds:data,cs:codestart:mov ax,datamov ds,axmov cx,4 ;循环次数mov ax,Yone:mov dx,0div Cpush dx ;余数入栈loop onemov cx,4lea bx,hextwo:pop axxlat ;转换成阿斯克码mov dl,almov ah,2int 21h ;输出loop twpmov ax,4c00hint 21hcode endsend start练习五:data segmentsum db ? ;定义总和所在内存空间data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,5 ;循环次数mov sum,0 ;总和先清为零begin:mov ah,1int 21h ;输入数字and al,0fh ;转换为十进制数字add sum,al ;求和loop beginmov ax,4c00hint 21hcode endsend start练习六:data segmentSUM db ?BUFFER db 6,?,6 dup(?) ;划出内存空间data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea dx,BUFFERmov ah,0ahint 21h ;输入5个数字mov SUM,0mov cx,BUFFER+1 ;循环次数mov bx,offset BUFFER+2 ;第一个数的地址one:mov al,[bx]and al,0fh ;转换为十进制数add SUM,al ;求和inc bxloop onemov ax,4c00hint 21hcode endsend start练习七:data segmentBUFFER db 6,?,6 dup(?)C dw 10X dw ?data endscode segmentmov ax,datamov ds,axlea dx,BUFFERmov ah,0ahint 21h 输入数字mov ax,0mov cx,offset BUFFER+1 ;循环次数lea bx,BUFFER+2 ;第一个数字的地址one:mul Cmov dl,[bx] ;取出一个字符add dl,0fh ;转换为二进制数add al,dladc ah,0inc bxloop onemov X,axmov ax,4c00hint 21hcode endsend start练习八:data segmentarray db 20 dup(8ah) 初始化内存data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea bx,arraymov cx,20 ;循环次数lop:mov byte ptr [bx],0 ;把数据重置为0inc bxloop lopmov ax,4c00hint 21hcode endsend start练习九:data segmentlist dw 3,2,4,5,54,24,7,23,89,34 ;定义数组sum dw ?data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,10 ;循环次数lea bx,listmov sum,0 ;首先置总和为0mov ax,0lop:mov dx,[bx]add ax,dxinc bxinc bx ;bx存入下一个数据地址loop lopmov sum,ax ;求和mov ax,4c00hint 21hcode endsend start课内练习程序一: 1)利用循环结构编程,计算28。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电学院
微机原理实验报告题目:宏指令及子程序设计实验
院系名称:计算机学院
专业名称:计算机科学与技术
班级:0901
学生姓名:***
学号(8位):********
指导教师:***
2.5 宏令及子程序设计实验
2.5.1 实验目的
1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。
2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。
3、了解宏指令与子程序的异同以及各自的适用场合。
2.5.2 实验预习要求
1、复习宏指令的定义与调用方法。
2、复习过子程序的定义与调用方法。
3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。
4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.5.3 实验内容
从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在
屏幕上显示出来。
要求:
①在屏幕上显示字符串提示信息的
功能由宏指令DSTRING实现;
②将键盘输入的十进制数转换成二
进制数由子程序DTOB实现;
③在N个无符号字节型二进制数中
找出最大数的功能由子程序FMAX实现;
④将一个无符号字节型二进制数转
换为十进制数并在屏幕上显示的功能由子
程序BTOAD实现。
程序运行结果如右图所示。
1、编程指导
(1)显示提示信息的宏指令DSTRING的编写
宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。
这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。
读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。
下面给出实现提示信息显示的宏指令的定义:
DSTRING MACRO STRING
PUSH DX
PUSH AX
MOV DX,OFFSET STRING
MOV AH,09H
INT 21H
POP AX
POP DX
ENDM
请读者注意,宏指令应该先定义,后调用。
因此,宏定义通常紧跟在代码段中段寄存器赋值指令之
后给出。
(2)将键盘输入的十进制数转换为二进制数的子程序DTOB 的编写
子程序的定义方法请参阅教材“5.6.4 子程序设计”一节。
将十进制数转换为二进制数的程序代码请参阅本书“2.4.3 实验内容”中“编程指导”部分。
(3)在N 个无符号字节型二进制数中找出最大数的子程序FMAX 的编写
请参阅教材“5.6.3 循环程序设计”一节例5.12。
(4)将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的子程序BTOAD 的编写
程序代码请参阅本书“2.4.3 实验内容”中“编程指导”部分。
2、程序框架
COUNT EQU 10 DATA SEGMENT
NUM DB 10 DUP(?) IBUF DB 7,0,6 DUP(?) OBUF DB 6 DUP(?) INFOR1 D B "Please input 10 numbers:",0AH,0DH,'$' INFOR2 D B "The max found in the 10 numbers is $" INFOR3 D B 0AH,0DH,'$'
DATA ENDS
STACK SEGMENT stack
DA TA2 DW 40 DUP(?) TOP EQU LENGTH DA TA2
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,SS:STACK
start: MOV AX,DA TA
MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX
DSTRING INFOR1 MOV BX,OFFSET NUM MOV CX,COUNT
LOOP1: CALL
DTOB
.
DSTRING INFOR3
MOV [BX],AL
INC BX
LOOP LOOP1
MOV AX,OFFSET NUM
MOV CX,COUNT
CALL FMAX
DSTRING INFOR2
CALL BTOAD
MOV AH,4CH
INT 21H
CODE ENDS E ND start
2.5.4 实验习题
1、从键盘输入N 个十进制数,求它们的和(累加和要求不大于65535),并将累加结果在屏幕上显示出来。
要求给出必要的提示信息(用宏调用完成);累加功能由子程序调用实现;二进制数形式的累加和转换为十进制数并显示由子程序调用实现。
程序代码:
DA TA SEGMENT NUM DB 10 DUP(?) ;用来存N 个数(二进制)小于一个字节 N DB ? ;用来存N 的值 IBUF DB 7,0,6 DUP(?) ;用来将十进制转换为二进制 OBUF DB 6 DUP(?) ;用来将二进制转换为十进制 INFOR1 D B "Please input the N:$" INFOR2 DB 0AH,0DH,"Please input the numbers:",0AH,0DH,'$' INFOR3 D B 0AH,0DH,"The sum is: $" INFOR4 D B 0AH,0DH,'$' DA TA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DA TA MOV DS,AX
DSTRING MACRO STRING ;宏定义 PUSH DX PUSH AX
MOV DX,OFFSET STRING MOV AH,09H INT 21H POP AX POP DX ENDM DSTRING INFOR1 MOV
AH,01H
INT 21H
SUB A L,30H
MOV N,AL
DSTRING INFOR2
MOV BX,OFFSET NUM
MOV CL,N
MOV CH,0
LOOP1:PUSH CX
CALL DTOB
DSTRING INFOR4
MOV [BX],AL
INC BX
POP CX
LOOP LOOP1
MOV SI,OFFSET NUM
MOV CL,N
CALL XADD
DSTRING INFOR3
CALL BTOAD
JMP T2
DTOB:MOV DX, OFFSET IBUF ;键入一个十进制数(<65535)MOV AH, 0AH
INT 21H
MOV CL, IBUF+1 ;十进制数的位数送CX
MOV CH, 0
MOV SI, OFFSET IBUF+2 ;指向输入的第一个字符(最高位)
MOV AX, 0 ;开始将十进制数转换为二进制数AGAIN:MOV DX, 10 ; ((0?10+a4) ?10+…) ?10+a0,将数存到AL中MUL DX
AND BYTE PTR [SI], 0FH
ADD AL, [SI]
ADC AH, 0
INC SI
LOOP AGAIN
RET
XADD:MOV AX,0
T1:MOV BL,[SI] ;使程序可以算出大于一个字节的数
MOV BH,0
ADD AX,BX
INC SI
LOOP T1
RET
BTOAD:MOV B X, OFFSET OBUF+5
MOV BYTE PTR [BX],'$'
MOV CX, 10 ;做(DX):(AX)/10运算
LOOP2:MOV DX, 0 ;被除数高16位清0
DIV CX
ADD DL, 30H ;将DL中的一位十进制数转换为ASCII码
DEC BX
MOV [BX], DL
OR AX, AX
JNZ LOOP2 ;判断商是否为0,不为0继续
MOV DX, BX
MOV AH, 09H
INT 21H ;显示转换得到的十进制数
RET
T2:MOV AH,4CH
INT 21H
CODE ENDS
END S TART
程序流程图:Array
实验中遇到的问题:
1,当相加结果大于一个字节所能表示的范围时,输出结果错误
2,不同字长的数相加结果不一样,容易混淆
解决方法:
用更多的字节来存储结果,相加是让两个数的字长一致
2.5.5 实验报告总结
1、补全“2.5.3 实验内容”中源程序框架内未写出的程序代码,并说明你在调试该程序过程中遇到了哪
些问题,是如何处理的?若允许输入大于255小于65536的十进制数,程序应如何修改?
答:修改存储数据的字节数,使其能存储大于255的数值,如DW。
2、写出实验小结,内容包括实验心得(收获)、不足之处或今后应注意的问题等。
掌握宏指令的定义和使用方法。
学会根据不同的数值选用不同大小的空间来存储。
掌握数值的输入和输出,以及不同大小的数值怎样存储,怎样运算。