当前位置:首页 > 汇编语言实验手册(刘辉)
jmp stop casew: ;分支4 lea dx,str4 mov ah,09h int 21h ; 输出以”$”结尾的字符串,ds:dx=串地址 jmp stop stop: mov ax,4c00h int 21h code_seg ends end start 2.观察给定的三个汇编语言源程序,从中找出实现if?then、if?then?else、switch的汇编
语句,然后试试再用不同的汇编语句来实现三种分支结构。
【设计性内容】
3.根据以下要求建立一个具有分支结构的汇编语言源程序,然后对其进行汇编、连接形成可执行文件,最后执行可执行文件,观察运行结果。
程序4:试编写一程序,从键盘接收字符,如果是一个小写字母,则找出它的前导字符和后继字符(如’c’的前导字符是’b’,后继字符是’d’,而’a’没有前导字符,’z’没有后继字符),按顺序显示这三个字符,如果是数字0~8,则加1后输出结果,如果是9,则减1后输出结果。
19
实验五 子程序设计
一、实验目的:
学习同一段内子程序设计的基本方法和技能,主程序与子程序分别通过寄存器、公共变量进行参数传递。 二、实验要求:
(1)根据要求建立源程序,并汇编连接形成可执行文件。
程序完成功能:将一个全是小写字母,以0结尾的字符串,转化为大写。要求用子程序完成该主要功能。
程序要处理的字符串以0作为结尾符,这个字符串可以如下定义:
db ‘conversation’,0 (2)通过debug调试的方法了解上述程序的运行情况,观察运行结果是否正确。 (3)分析给定的程序,找出其中问题所在并改正。 三、实验步骤与内容:
应用这个子程序,按要求字符串的内容后面一定要有一个0,标记字符串的结束。子程序可以依次读取每个字符进行检测,如果不是0,就进行大写的转化,如果是0,就结束处理。由于通过检测0而知道是否已经处理完整个字符串,所以子程序可以不需要字符串的长度作为参数。我们可以用jcxz来检测0。
注:jcxz:如果cx==0(zero)则跳转(jump)。
1、给定子程序1及对应的主程序的实现如下,请建立该完整源程序,在源程序最前面加上程序名称、功能、创建者、创建时间、编译方法、使用方法等注释内容,如下: ;---------------------------------------------------------------- ;Program: ;Created by: ;Finished Date & Time: ;Assembled and linked: ;Use:
;---------------------------------------------------------------- 并汇编连接形成可执行文件5-first.exe。
;**************************************************************** ;说明:将一个全是小写字母,以0结尾的字符串,转化为大写 ;参数:公共变量straA是字符串的首地址 ;结果:没有返回值 capital1 proc mov si,0
s: mov cl,straA[si]
;si充当下标,类似于c语言中的数组下标 ;将字符串中的字符一次送入cl中
mov ch,0
jcxz ok ;如果(cx)=0,结束,否则处理。 and straA[si],11011111b inc si jmp s
;将字符串straA中的第si个字母转化为大写 ;指向下一个单元
;继续下一个字符的处理
20
ok: ret
capital1 endp
我们来看一下这个子程序的应用,将data段中的字符串转化为大写,完整的程序如下: C语言实现:c语言源程序 5-first.c #include
行文件5-second.exe:
;**************************************************************** ;说明:将一个全是小写字母,以0结尾的字符串,转化为大写 ;参数:di:si指向字符串的首地址 ;结果:没有返回值 capital2 proc s: mov cl,[si]
mov ch,0
jcxz ok ;将ds:si所指单元中的字母转化为大写
and byte ptr[si],11011111b ;ds:si指向下一个单元 inc si jmp s ok: ret
21
capital2 endp
完整的数据段和代码段程序如下: data segment
db 'conversation',0 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax
mov si,0 ;使ds:si指向字符串的首地址 call capital2 mov ax,4c00h int 21h capital2 proc s: mov cl,[si] mov ch,0 jcxz ok and byte ptr[si],11011111b inc si jmp s ok: ret capital2 endp code ends end start
3、根据以上内容,认真阅读下面文字,回答相应问题,完成相应操作。 问题1:子程序2是利用寄存器方式进行主程序与子程序之间参数的传递,用到了哪个寄存器? 问题2:指令“and straA[si],11011111b”是怎样实现小写字母转大写字母的? 由于该程序没有输出,所以直接运行时无法观察到运行结果。通过分析知道程序完成功能是将原有数据段中一个字符串转化为大写,所以只要观察程序运行前后数据段相应存储单元的内容变化情况,就可以知道程序运行是否正确,这可以通过使用debug来实现。过程如下(以5-second.exe为例):
1)先利用debug将可执行代码调入内存,并察看数据段的段地址(如下右侧红色数据,具体值根据不同机器而有所不同)
2)用d命令察看数据段中的原有的字符串(右侧黄色字部分):
3)用g命令运行程序,程序正确执行,然后用d命令观察数据段中的变化:
22
共分享92篇相关文档