汇编语言程序设计(四子程序)_第1页
汇编语言程序设计(四子程序)_第2页
汇编语言程序设计(四子程序)_第3页
汇编语言程序设计(四子程序)_第4页
汇编语言程序设计(四子程序)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 子程序子程序是程序的一部分,是完成特定功能特定功能的程序段,它能够在程序的任何地方被调用。在使用子程序时应注意: (1)参数的传递。参数的传递。子程序调用时,经常需要将一些参数传给子程序,而子程序也常常需要在运行后将结果和状态等信息回送给调用程序。这种子程序和调用程序之间的信息传送,就是参参数传递数传递。参数的传递可通过寄存器、变量、地址表、堆栈等方式进行。 (2)相应寄存器内容的保护相应寄存器内容的保护。由于CPU寄存器数量有限,子程序要用到的一些寄存器常在调用程序中也被用到,为了防止破坏调用程序中寄存器的内容,需在子程序入口处将所用到的寄存器内容压入堆栈保存; (3)子程序还可以调用别的

2、子程序子程序还可以调用别的子程序,即子程序嵌套子程序嵌套。 与子程序调用有关的CPU指令有:CALL和RET;伪指令有:PROC和ENDP。1.实验目的: 掌握汇编语言子程序及功能调用结构、指令及调用方法。 学习二进制数转换为十六进制数并显示的方法。2.实验内容: 掌握子程序的编程格式: 子程序名子程序名 PROC NEAR/FAR(子程序属性) RET 子程序名子程序名 ENDP。 编写一个子程序,把一个16位二进制数二进制数用十六进制十六进制形式在屏幕上显示出来。 分别运用如下2种参数传递方法,并用一个主程序验证它。 采用AX寄存器传递这个16位二进制数。 。 采用wordTEMP变量传递

3、这个16位二进制数。 3.实验用设备仪器及材料: 硬件:计算机 软件:DEBUG调试软件。4.实验要求: 能在DEBUG提示符下,编写简单的汇编程序。 熟练掌握修改寄存器、存储单元的方法,理解段地址段地址、偏移量偏移量的表达方式。5.实验步骤:实验步骤:用文件编辑器编写汇编语言程序(如:记事本),并以asm为后缀命名, 如:2.asm 运行masm编译器进入dos,调入所编写的汇编程序,生成2.obj,然后用 link.exe连接2.obj文件,生成可执行文件2.exe. 用DEBUG调用2.exe文件,格式为DEBUG 2.EXE 用D命令观察内存单元值用U命令观察源程序 用G命令运行程序

4、用T命令单步执行程序用R命令观察或修改寄存器内的值 6.实验报告: 同学要对本次实验课的内容加以总结,并写出自己对本次实验的体会和 收获。 实验报告格式: 实验名称 实验材料 实验步骤 实验总结 实验原理:实验原理: AX中16位二进制数对应4位十六进制数,先转换最高4位成ASCII码并显示(循环左移4位,使最高4位移到AL的低四位,使AL高4位为0,等待处理,注意事先保存原AX值,防止丢失),然后转换次高四位并显示,以此类推。最后显示“H”(表示16进制) 1位十六进制(对应4位二进制)转换为ASCII码原理如下: 将获得的16进制数与9H比较: 若9H,则先加上30H,再加上07H,才为该

5、数的ASCII码。 高四位次高次低低四位0481215AXAX循环左移4位 ROL AX,CLDL次高次低低四位 高四位高四位低四位次高次低DHDL高四位低四位屏蔽DL高4位 AND DL,0FHDL高四位0高四位3高四位3判DL低4位DL39HDL39H,DL+07HDL内的数送显示显示功能调用AH=02H,DL=数,INT 21HDL+30保存AX中的数DXASCII码对照表:码对照表: BinDecHex缩写缩写/字符字符0010111147 2F/ 0011000048 3000011000149 311 0011001050 32 20011001151 333 0011010052

6、 34 40011010153 355 00110110543660011011155 37 7 0011100056 388 0011100157 39 90011101058 3A: 00111011593B;0011110060 3C 0011111163 3F ?0100000064 40 010000016541A0100001066 42 B 010000116743C0100010068 44 D 010001016945E010001107046 F低低10位位 高高6位位 实验参考程序实验参考程序1(寄存器传递参数寄存器传递参数):data segment wordtemp

7、dw 105Eh ;也可用也可用二进制表示二进制表示 0001 0000 0101 1110bdata endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov ax,wordtemp call ALdisp mov ax,4c00h ;设置功能调用设置功能调用 AH=4C 带返回码结束 int 21h ALdisp proc ;实现实现al内容显示的内容显示的子程序子程序 push ax ;过程中使用了过程中使用了AX、BX、CX和和DX,寄存器内容压栈保护数据。寄存器内容压栈保护数据。 push bx p

8、ush cx push dx mov bx,4 ;设置设置移动次数,存放移动次数,存放ASCII码地址首地址码地址首地址 a1: mov cl,4 ;设置左移位数设置左移位数 rol ax,cl ;循环左移循环左移 push ax;暂存暂存ax里的数据,里的数据,DOS功能会改变功能会改变AL内容内容 mov dl,al;转换转换al的高的高4位位 and dl,0fh ;将将dl中的高中的高4位清零位清零 or dl,30h;dl高高4位变成位变成3 cmp dl,39h jbe aldisp1 ; dl内的数小于等于内的数小于等于39h转移转移 add dl,7;是是0Ah0Fh,还要加上

9、,还要加上7aldisp1:mov ah,2;显示,显示,ah=02表示:将表示:将dl中的内容以字符的形式输出到屏幕中的内容以字符的形式输出到屏幕 int 21h ;系统功能调用,至于是那种功能调用,取决于系统功能调用,至于是那种功能调用,取决于ah里的内容里的内容 pop ax ;弹出栈,此时弹出栈,此时ax的内容为循环左移的内容为循环左移4位原数位原数 dec bx ;计数器减计数器减1 (左移次数左移次数) jnz a1 ;结果不为结果不为0转移,进行下一个转移,进行下一个4位转换位转换 mov dl,H mov ah,2;显示字符显示字符“H” int 21h pop dx pop

10、cx pop bx pop ax ret ;过程返回过程返回ALdispendp code ends end start实验参考程序实验参考程序2(变量传递参数变量传递参数):data segment wordtemp dw 2df4hdata endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax call ALdisp mov ax,4c00h int 21h ALdispproc ;实现实现al内容的显示内容的显示 push ax ;过程中使用了过程中使用了AX、BX,CX和和DX push bx push

11、cx push dx mov ax,wordtemp mov bx,4a1: mov cl,4 rol ax,cl push ax mov dl,al;转换转换al的高的高4位位 and dl,0fh or dl,30h;al高高4位变成位变成3 cmp dl,39h jbe aldisp1 add dl,7;是是0Ah0Fh,还要加上,还要加上7aldisp1:mov ah,2;显示显示 int 21h pop ax dec bx jnz a1 mov dl,H mov ah,2;显示显示 int 21h pop dx pop cx pop bx pop ax ret;过程返回过程返回ALd

12、ispendp code ends end start实验参考程序: -a XXXX:0100 mov bx,0120 ;将第一个被加数的地址放入;将第一个被加数的地址放入BX中。中。 Mov si,0130 ;将第一个加数的地址放入;将第一个加数的地址放入SI中。中。 Mov cx,5 ;设置循环次数必须放入;设置循环次数必须放入CX中。中。XXXX:0109 Mov al,bx ;将被加数放入;将被加数放入AL中。中。 Adc al,si ;被加数;被加数+加数,和数放入加数,和数放入AL中。中。 Mov bx+20,al ;将;将AL中的和数送到中的和数送到BX+20地址单元中。地址单元

13、中。 Inc bx ;BX+1,取下一个被加数的地址。,取下一个被加数的地址。 Inc si ;SI+1,取下一个加数的地址。,取下一个加数的地址。 Loop 0109 ; CX-1,CX=0?,?,CX0返回返回0109地址。地址。XXXX:0114 命令格式提示:命令格式提示:用E命令修改01200124和01300134各五个单元中的数据,观察并验证数据的正确性。_e 0120 00.被加数1 00.被加数2 00.被加数3 00.被加数4 00.被加数5 (修改单元数据)_e 0130 00.加 数1 00.加 数2 00.加 数3 00.加 数4 00.加 数5 (修改单元数据)_d

14、 0100 观察内存单元中存放程序的情况。_g=0100 0114 运行程序(需要给出起始地址0100,中断地址0114)。_t=0100 逐条执行程序指令,注意观察cs、ip、ax、bx、cx等寄存器值的变化。DEBUG命令使用方法:哪一类问题可以用子程序来完成其功能?仔细观察调用子程序时,CS、IP寄存器内地址数据变化情况。观察子程序返回时堆栈SS、SI寄存器内数据的变化。分析不同参数传递方法的优缺点 。为什么思考问题16.3 直接定址表 现在,我们讨论用查表的方法编写相关程序的技巧。 编写子程序,以十六进制的形式在屏幕中间显示给定的byte 型数据。 分析16.3 直接定址表 分析:一个

15、字节需要用两个十六进制数码来表示,所以,子程序需要在屏幕上显示两个ASCII 字符。我们当然要用“0”、“1”、“2”、“3”、“4”、“5” 、“6” 、“7” 、“8” 、“9” 、“A”、“B”、“C”、“D”、“E”、“F”这16个字符来显示十六进制数码。16.3 直接定址表 我们可以将一个byte的高4位和低4 位分开,分别用它们的值得到对应的数码字符。 比如 2Bh ,我们可以得到高4 位的值为2,低4 位的值为11。 那么我们如何用这两个数值得到对应的数码字符“2”和“B”呢?16.3 直接定址表 最简单的办法就是一个一个地比较,如下:如果数值为 0,则显示“0”;如果数值为 1,则显示“1”; :如果数值为11,则显示“B”; : 我们可以看出,这样做,程序中要使用多条比较、转移指令。 程序将比较长,混乱。 16.3 直接定址表 显然,我们希望能够在数值015和字符“0”“F”之间找到一种映射关系。 这样我们用015间的任何数值,都可以通过这种映射关系直接得到“0”“F”中对应的字符。16.3 直接定址表 数值09和字符“0”“9”之间的映射关系是很明显的,即: 数值+30h=对应字符的ASCII值: 0+30h=“0”的ASCII值 1+30h=“1”的ASCII值 2+30h=“2”的ASCII值 :16.3 直接定址表 但是,1015和“A”“F”

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论