《汇编语言》上机实验内容//理解

【实验目标要求】

《汇编语言》是计算机科学与技术专业必修的专业基础课程。汇编语言程序设计实验的目标是学习汇编语言程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,汇编语言程序实验的内容与计算机硬件特性联系紧密。通过上机实验的学习,使学生不仅能加深理解和巩固理论课所学的知识,而且还能了解计算机的底层软件的工作过程,为今后学习后续课程打好良好的基础。
【实验学习要求】
认真阅读《IBM-PC汇编语言程序设计》教材中与实验相关的章节内容,提前做好实验预习,做到在每个实验前明确实验目的、掌握实验的基本内容及操作方法;在实验中正确使用实验设备,认真观察、分析实验结果;实验后要根据要求做好总结,上交实验报告。具体要求如下:
1.上机前,要作好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。
2.上机时,要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序、调试程序)的使用方法;在程序调试过程中,有意识的学习及掌握Debug的各种操作命令,以便掌握程序的调试方法及技巧;程序调试完后,须由实验辅导教师在机器上检查运行结果。
3.上机后,应写出实验报告,及时总结。
4.遵守实验室的规章制度,爱护实验设备。

【实验计划】

实验序号 实验项目内容 学时
实验一 IBM-PC寻址方式及DEBUG的使用 3
实验二 熟悉指令系统 3
实验三 建立运行汇编语言程序 3
实验四 循环程序设计 2
实验五 分支程序设计 2
实验六 子程序设计 2
实验七 I/O程序设计 2

【实验教材及主要参考资料】

教材:
1.《IBM-PC汇编语言程序设计(第二版)》,沈美明、温冬蝉编著,清华大学出版社,2001.8。
2.《IBM-PC汇编语言程序设计实验教程》,沈美明、温冬蝉、张赤红编著,清华大学出版社,2008.2。

【实验任务】

知识点

debug操作
在这里插入图片描述
在这里插入图片描述
命令应用

实验一、IBM-PC寻址方式及DEBUG的使用

实验目的:
1.熟悉DEBUG的功能,运行并掌握其常用命令。
2.使用DEBUG,通过数据传送指令观察IBM-PC机各种寻址方式的区别。
实验内容:

  1. DEBUG的加载及其常用命令(A、U、R、D、E、T、P、G、Q)的使用情况。(注意:微机进入DEBUG状态下之后,一切立即数和地址数据均被默认为十六进制数,在输入时数的后面不加后缀“H”。)
    2.将数据段中的两个数求和,结果保存在数据段中。
    源程序、机器语言程序如下:
    CS:0100 Al 00 00 MOV AX,[0000]
    CS:0103 03 06 02 00 ADD AX,[0002]
    CS;0107 A3 04 00 MOV [0004],AX
    CS:010A CB RETF
    数据段内容如下:
    DS:0000 2301 2500 ;两个已知数
    3.在Debug中编制简单的汇编程序片断,并调试运行,得出结果。
    实验主要步骤:
    1.在DOS或Windows的命令行窗口执行命令Debug.exe,进入Debug程序环境,熟悉Debug各个命令的用法。
  2. 实验步骤
    (1)用E命令键人上述机器语言程序和数据段的初值。
    —E DS:000 2301 2500 //000是地址,将01赋给000,将00赋给001 ,23 25截断
    —E DS:006 2A 2A 2A (2A为*,是为便于查看数据段内容而设置)
    —E CS:100 A1 00 00 03 06 02 00
    —E CS:107 A3 04 00 CB
    (2)用D命令检查数据段、代码段内容。
    —D DS:0
    —D CS:100
    (3)用T命令逐条执行上述程序,注意观察每条指令执行后相应寄存器的变化。//用多少次t取决汇编代码的指令有多少条
    (4)用U命令反汇编本程序。
    —U 100 10A
    (5)用R命令修改IP的内容为0100重新执行上述程序。
    —R IP
    显示:IP 010A
    :0100
    (6)用G命令运行程序。
    —G =CS:0100 107
    观察:IP= AX=
    —G =CS:0100 10A
    观察:IP= AX=
    3.自己试着写段程序:
    -A 100↙
    16C6:0100 DB‘1234567890‘↙
    16C6:010A CLD↙
    16C6:010B MOV SI,100↙
    16C6:010E MOV DI,200↙
    16C6:0111 MOV CX,A↙
    16C6:0114 REP MOVSB↙
    16C6:0116↙
    -G =10A 116↙;运行上述程序(起始地址10AH,结束地址116H)。
    -D 100 L A↙;显示DS:100开始10个字节内容
    16C6:0100 31 32 33 34 35 36 37 38-39 30 ‘1234567890
    -D ES:200 L A↙显示ES:100开始10个字节内容
    16C6:0200 31 32 33 34 35 36 37 38-39 30 ‘1234567890
    4.写出实验报告。
    在这里插入图片描述
    在这里插入图片描述

知识点

  1. 汇编的基本框架:
    定义数据段
    就是数据存放的地方
    DATA
    SEGMENT

    DATA
    ENDS
    定义代码段
    当然就是要执行的程序代码了
    CODE
    SEGMENT
    START:

    CODE
    ENDS
    END
    START

  2. 字与字节的差别
    字节(Byte/bait/n.[C])是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于有八位,也表示一些计算机编程语言中的数据类型和语言字符。"字"由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。字是计算机进行数据处理和运算的单位。区别:例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。

数据定义指令格式如下: 格式:〔符号名〕 DB\DW\DD\DF\DQ\DT 初值序列 DB定义的为字节类型,DW定义字类型,DD定义双字类型,DF为长字类型,DQ为四字类型,DT为十字节类型,该指令分别定义8位,16位,32位,48位,64位,80位的数据 DW就是表示为该数据分配一个字的存储空间,即16位例如: ARRAY DW 3 DUP(1) 给数组ARRAY 分配3个字,初值为1

  1. 在这里插入图片描述
  2. 在这里插入图片描述
    在这里插入图片描述

实验二、熟悉指令系统

相似的题目:https://blog.csdn.net/qq_41767945/article/details/93417708

实验目的:
1.熟悉8088/8086的指令书写格式、功能。
2.能熟练运用数据传递、算术、逻辑三类指令。
实验内容:
1.用DEBUG调试程序功能编程序计算(W—(X×Y+Z—540))/X。其中X、Y、Z、W均为16位带符号数,要求上式计算结果的商存人AX寄存器中,余数存人DX寄存器。掌握算术指令的用法。
2.用DEBUG编程并查看逻辑指令的运行结果,掌握逻辑指令的用法。
3.熟悉其它几组指令的功能和用法,并区分字、字节操作。
实验主要步骤:
1.预先编制程序片段,实现(W—(X×Y+Z—540))/X,将计算结果的商存人AX寄存器中,余数存人DX寄存器。
程序代码如下:
DATA SEGMENT // data segment 是用来存全局变量和静态变量的内存区域。
X DW 1200H//知识点

数据定义指令格式如下: 格式:〔符号名〕 DB\DW\DD\DF\DQ\DT 初值序列 DB定义的为字节类型,DW定义字类型,DD定义双字类型,DF为长字类型,DQ为四字类型,DT为十字节类型,该指令分别定义8位,16位,32位,48位,64位,80位的数据 DW就是表示为该数据分配一个字的存储空间,即16位例如: ARRAY DW 3 DUP(1) 给数组ARRAY 分配3个字,初值为1

Y DW 0034H
Z DW 0F045H
W DW 034AH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
…… ;在此补充程序代码

MOV AX, X
IMUL Y
MOV CX, AX
MOV BX, DX
MOV AX, Z
CWD
ADD CX, AX
ADC BX, DX
SUB CX, 540
SBB BX, 0
MOV AX, V
CWD
SUB AX, CX
SBB DX, BX
IDIV X

MOV AH,4CH
INT 21H //显示
CODE ENDS
END START
2.可以在Debug程序中使用E命令为变量X、Y、Z、W设置初值。
3.使用A命令汇编程序片段,并用G或T命令执行,用R或D命令查看结果。
4.使用A命令汇编几条逻辑指令,并运行,查看结果。
5.写出实验报告。

知识点

https://zhidao.baidu.com/question/206232052.html

https://blog.csdn.net/spygg/article/details/7828573?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

https://blog.csdn.net/INZT__/article/details/80644658
答案:https://wenku.baidu.com/view/38f1b226941ea76e58fa04e3.html

1.mov ah 09h
int 21h
是实现DOS调用中的09号功能,就是在屏幕上显示字符串
2.jnz结果不为零(或不相等)则转移。
jz即零标志为1就跳转。

JNZ(或JNE)(jump if not zero, or not equal),汇编语言中的条件转移指令。结果不为零(或不相等)则转移。
测试条件:ZF=0

ZF汇编语言中的PSW标志寄存器中的一位,而JZ则是根据ZF决定是否跳转。若ZF=1(表示本次运算结果为0,不为0则ZF=0),则跳转,否则,不跳转ZF的状态根据其他指令的执行结果设置。
jz=jump if zero,即零标志为1就跳转,一般与cmp连用,用以判断两数是否相等。jz的另一种写法就是je,je=jump if equal,jz和je的作用是完全一样的。
JZ是累加器A判零条件转移指令。

3.1、OFFSET是将数值回送变量或标号的偏移地址值. 2.LEA是将数值回送变量或标号的有效地址值.3.SEG,汇编程序将回送变量或标号的段地址值. 4、LEA BX,LIST5、MOV BX,OFFSET LIST6、可以看出,LEA和OFFSET这两条指令在功能上是相同的,BX寄存器都可得到符号地址LIST的值,而且此时MOV指令的执行速度会比LEA指令更快。但是,OFFSET只能与简单的符号地址相连,而不能和诸如LIST[SI]或[SI]等复杂操作数相连。因此,LEA指令在取得访问变量的工具方面是很有用的。

实验三、建立运行汇编语言程序

实验目的:
1.掌握汇编语言程序格式及其它命令的作用。
2.掌握汇编、连接、运行汇编程序的全过程,并能检查修改程序简单错误。
实验内容:
1.编写程序,比较两个字符串STRINGl和STRING2所含的字符是否相同。若相同,则显示’Match’;否则,显示’No match’。
2.编辑、汇编、连接这个汇编语言源程序,形成.EXE文件。
3.通过DEBUG调试运行该可执行文件,查看运行结果。
实验主要步骤:
1.根据要求编制汇编源程序。
参考程序如下:
DATA SEGMENT
STRINGl DB ‘Move the cursor backward.’
STRING2 DB ‘Move the cursor backward.’
MESSl DB ‘Match.’,13,10,‘$’//mess1是变量名,db是类型,后面的是内容

这里是引用

MESS2 DB ‘NO Match!’,13,10,‘$’
DATA ENDS
PROG SEGMENT
ASSUME CS:PROG,DS:DATA,ES:DATA//

这是段赋值语bai句是一条指令,du一般放置zhi在代码段第一的位置,只有dao的段赋值语句是建zhuan立段shu寄存器,段名为不具备分配功能之间的关系,比如,你已经创建了几个部分,你怎么知道它是一个代码段,这是这一说法的数据段,因为段名可以任意取,你可以把代码的代码段,也可以是其他的名字,这句话他们建立的关系
程序段开头控制程序在cs 段内数据在ds 段内

START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
…… ;在此补充程序代码
mov es,ax
lea si, string1
lea di, string2
cld
mov cx,25
repz cmpsb
jz match
lea dx,mess2
jmp disp
match: lea dx,mess1
disp: mov ah,09
int 21h

MOV AH, 4CH
INT 21H
PROG ENDS
END START
2.使用记事本或其它字处理软件(Edit.exe)编辑该源文件。
3.使用Masm、Link程序汇编、连接该文件,形成可执行的.EXE文件。
参考步骤如下:
(1)调用全屏幕编辑程序EDlT建立ASM文件。
C>EDIT
输入实验内容1的源程序并以SAMPLE.ASM为文件名将文件存盘。
(2)用汇编程序MASM 对源文件SAMPLE.ASM 汇编并产生目标文件SAMPLE.OBJ。
C>MASM SAMPLE
如汇编指示有错误,则需重新调用编辑程序修改程序中的错误,直至汇编通过为止。
(3)用连接程序LINK产生执行文件SAMPLE.EXE。
C>LINK SAMPLE
(4)执行程序。
可直接从DOS状态执行程序。
C>SAMPLE
显示器上显示出程序的运行结果。
Match.
4.也可以使用Debug调试运行这个.EXE文件,并查看运行结果。对实验内容修改两个字符串的内容,使它们互不相同,再观察程序的运行结果。
5.写出实验报告。

知识点

汇编程序格式:
https://blog.csdn.net/algzjh/article/details/72843294

汇编从键盘输入的指令应该怎么写?
1.输入单个字符
mov ah,01h
int 21h

2.输入字符串
mov ah,0ah
int 21h

实验四、循环程序设计

https://zhidao.baidu.com/question/510357950.html?qq-pf-to=pcqq.c2c
实验目的:
1.加深对循环程序的理解。
2.能构造出正确的循环结构并能实现较复杂的算法。
实验内容:
1.编制程序,要求如下:从键盘接收一个四位的16进制数,在终端上显示与它等值的二进制数。
实验主要步骤:
1.根据要求,画出程序框图,写出汇编源代码。
参考程序如下:
CODE SEGMENT
ASSUME CS:CODE
Begin: MOV BX,0 ;用于存放四位的16进制数
MOV CH,4
MOV CL,4
INPUT: SHL BX,CL ;将前面输入的数左移4位
MOV AH,1 ;从键盘取数
INT 21H
CMP AL,30H ;<0吗?
…… ;在此补充程序代码
STOP: MOV AH, 4CH
INT 21H
CODE ENDS
END Begin
2.上机编辑源程序,并汇编、连接、调试运行,查看结果。
3.写出实验报告。
1

code segment
assume cs:code
start: mov bx,0
mov ch,4
mov cl,4
s0: mov ah,1 ;键盘输入416进制数
int 21h
cmp al,39h ;判断是0~9还是A~H,若是数字减30H,否则还要减07H
jbe next ;jbe当低于等于时转移
sub al,07h

next: sub al,30h
shl bx,cl
add bl,al ;转换后的数据存入BX,每存一次左移4位
dec ch
jnz s0 ;输入完则控制显示
mov cx,16

s1: mov dl,0
rol bx,1 ;循环左移1,最高位移入CF
adc dl,30h ;30H后可得该位的ASCII码.
mov ah,02h
int 21h
loop s1
mov ax,4c00h
int 21h
code ends
end start

2

BEGIN: MOV BX, 0 ;用于存放四位的16进制数
MOV CH, 4
MOV CL, 4
INPUT: SHL BX, CL ;将前面输入的数左移4位
MOV AH, 1 ;从键盘取数
INT 21H
CMP AL, 30H ;<0吗?
JB INPUT ;不是‘0~F’的数重新输入
CMP AL, 39H ;是‘09’吗?
JA AF ;不是,转‘A~F’的处理
AND AL, 0FH ;转换为:0000B~1001B
JMP BINARY
AF: AND AL, 11011111B ;转换为大写字母
CMP AL, 41H ;又<A吗?
JB INPUT ;不是‘A~F’的数重新输入
CMP AL, 46H ;>F吗?
JA INPUT ;不是‘A~F’的数重新输入
AND AL, 0FH ;转换为:1010B~1111B //规律
ADD AL, 9
BINARY: OR BL, AL ;将键盘输入的数进行组合
DEL CH
JNZ INPUT
DISPN: MOV CX, 16 ;将16位二进制数一位位地转换成ASCII码显示
DISP: MOV DL, 0
ROL BX, 1
RCL DL, 1
OR DL, 30H
MOV AH, 2 ;进行显示
INT 21H
LOOP DISP
STOP: RET

实验五

https://wenku.baidu.com/view/bb3e1505a0116c175e0e4869.html?qq-pf-to=pcqq.c2c

  • 15
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值