实验一8086计CPU系统寻址方式和汇编语言程序设
一、实验目的
(1)掌握8086CPU系统的逻辑地址和寻址方式。
(2)掌握8086CPU系统中机器数的表示方式。
(3)掌握指令的机器码表示方法。
(4)掌握堆栈的概念和操作过程。
(5)掌握集成开发环境下的程序设计和调试方法。
(6)掌握汇编语言实现具体算法的方式,区分汇编语言与高级语言的编程风格。
二、实验内容
●1. 汇编语言程序设计过程和调试实验
执行汇编源程序的编辑、编译和链接操作,并完成调试内容,掌握汇编语言程序设计的基本方法和技巧。
下面的汇编语言源程序实现了将16位(双字节)数据存入寄存器,进行寄存器和内存单元之间的数据传送,并将寄存器CX的数据送入栈内,再从栈内取出送人寄存器DX。程序流程图(即描述程序执行的过程)如图5.1所示,代码如下:
行号 代码
1 CODE SEGMENT
2 ASSUME CS:CODE
3 START: MOV AX ,8086H
4 MOV BX, 6800H
5 MOV SI,8H
6 MOV DS:[000BH],AX
7 MOV ES:[6808H],SI
8 ADD AX,SI .
9 MOV BX,[S1+3]
10 MOV CX. ES:[BX+ SI]
11 PUSH CX
12 MOV BX,0
13 MOV CX,3[BX][SI]
14 POP DX,
15 L1: JMP L1
16 CODE ENDS
17 END START
调试过程包括“单步调试”和“设置断点”两种,具体调试内容如下:
(1)单步调试:在TPC-USB集成开发环境的调试状态下,采用“单步执行”操作调试上述源程序中的每条汇编指令,观察执行过程,实时记录并描述每条指令运行后相关寄存器(如AX、BX、CX、DX)、内存(包括数据段.代码段、附加段、堆栈段)的变化情况以及所采用的寻址方式。
例如:1 MOV AX,8086H AX:0000H-→8086H 源操作数立即寻址方式和目标操作数寄存器寻址方式
2 MOV BX, 6800H BX:8FEAH→6800H 源操作数立即寻址方式和目标操作数寄存器寻址方式
3. MOV SI,8H SI:0100H→8H 源操作数立即寻址方式和目标操作数寄存器寻址方式
4 MOV DS:[000BH],AX DS:[000BH]: 3802H→8086H 源操作数寄存器寻址方式和目标操作数直接寻址方式
5 MOV ES:[6808H],SI ES:[6808H]:06C6H→8H 源操作数寄存器寻址方式和目标操作数直接寻址方式
6 ADD AX,SI AX:8086H→808EH 源操作数寄存器寻址方式和目标操作数寄存器寻址方式
7 MOV BX,[SI+ 3] BX: 6800H→8086H 源操作数寄存器相对寻址方式和目标操作数寄存器寻址方式
8 MOV CX, ES:[BX+SI] CX:0000H→6620H 源操作数基址加变址寻址方式和目标操作数寄存器寻址方式
9 PUSH CX SP:FFFEH→FFFCH 目标操作数寄存器寻址方式
10 MOV BX,0 BX: 8086H→0H 源操作数立即寻址方式和目标操作数寄存器寻址方式
11 MOV CX ,3[BX][SI] CX:6620H→8086H 源操作数相对的基址加变址方式和目标操作数寄存器寻址方式
12 POP DX SP:FFFCH→FFFEH DX:2002H→6620H 目标操作数寄存器寻址方式
注意:只记录变化的寄存器和内存单元。
设置断点。在TPC-USB集成开发环境的调试状态下,在上述源程序的第10行语句处“设置断点”。首先,执行“连续执行”操作到断点处,记录此时堆栈段的栈底数据,以及寄存器SS、SP、CX和DX的实时数据情况;然后,执行“单步执行”操作,运行当前PUSH CX指令,记录并描述运行指令后堆栈窗口栈底数据的变化情况,以及寄存器SS、SP、CX和DX是否有变化;最后,再次执行“单步执行”操作,运行当前POP DX指令,记录并描述运行指令后堆栈窗口栈底数据的变化情况,以及寄存器SS、SP、CX和DX是否有变化,总结并描述8086CPU栈操作的过程。
图1.1 执行到第10行时栈底数据

图1.2 执行到第10行时寄存器数据

图1.3 执行PUSH后栈底数据

图1.4 执行PUSH后寄存器数据
通过图1.3和图1.4,我们可以得出执行完PUSH指令后,堆栈窗口由0FE6:FFFE变为了0FE6:FFFC,内容也有FF FF变为了20 66 FF FF,寄存器SS,CX,DX没有变化,SP由FFFE变为了FFFC。

图1.5 执行POP后栈底数据

图1.6 执行POP后寄存器数据
通过图1.3和图1.4,我们可以得出执行完POP指令后,堆栈窗口由0FE6:FFFC变为了0FE6:FFFE,内容也由20 66 FF FF变为了FF FF,寄存器SS,CX没有变化,SP由FFFC变为了FFFE,DX变为了6620H。
通过对比图1.4和图1.6我们可以得到8086CPU栈操作的过程是在PUSH指令时SP地址先减2,然后高字节存入高地址,低字节存入低地址,在POP指令时,先将SP和SP+1的内容弹入到应存放的寄存器,再进行SP地址加2。
查看反汇编结果。切换至“反汇编"显示窗口,查看每条指令的机器码表示方法(包括操作码和操作数),记录反汇编结果并分析上述源程序的反汇编结束指令语句和末地址;记录并描述上述源程序第3行(MOV AX ,8086H)、第9行(MOV BX,[SI + 3])语句中的操作码和操作数。

图1.7 反汇编结果
根据图1.7,我们可以看出反汇编结束指令语句为POP BX,结束地址为0FE88H,第3行的操作码为B8,操作数为8680,第9行的操作码为8B,操作数为5C03。
将第3行(MOV AX ,8086H)、第4行(MOV BX , 6800H)语句中8086H和6800H分别修改为8086和6800,然后重新进行编译和链接操作,采用“单步执行”操作这两句指令,记录并描述寄存器窗口中AX和BX的变化,总结并描述8086CPU机器数的表示方式及双字节数在寄存器中的存放规律。

图1.8 AX中的变化

图1.9 BX中的变化
由图1.8和图1.9可以看出将第3行(MOV AX ,8086H)、第4行(MOV BX , 6800H)语句中8086H和6800H分别修改为8086和6800后,AX变为了1F96H,BX变为了1A90H,由此可以看出8086CPU机器数的表示方式为以16进制数表示,双字节数在寄存器的存放规律为高字节存放在高地址,低字节存放在低地址。
●2. 编程设计实验(一)
内存中现有X和Y两个存储单元,分别存有42和-43,利用汇编语言编程计算这两个数之和,并将结果放入SUM存储单元。
实验操作及调试步骤如下:
(1)在TPC-USB环境中根据编程设计任务完成汇编源程序的编辑、编译和链接操作,生成可执行文件。
(2)在调试状态下应用“单步执行”或“设置断点”操作进行调试。结合程序调试过程自行设计调试方案。记录源程序在内存(包括数据段和代码段)中的位置、大小,以及数据段存储单元中数据的变化情况,并描述机器数在内存(数据段)中的存放规律以及有符号数在内存中的表示形式。
注意:①位置是指源程序的数据段和代码段在内存中存放的开始地址到结束地址的逻辑地址及范围(数据段或代码段的段地址:开始地址~ 结束地址)。
②大小是指所占内存的字节(或存储单元)个数。
代码:
DATA SEGMENT X DB 42 Y DB -43 SUM DB 00H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV BL,X ADD BL,Y MOV SUM,BL MOV AH,4CH INT 21H CODE ENDS END START |
我们进行单步调试,当执行完MOV BL,X后,BL中的内存变化如图2.1所示,我们可以看出执行后BL变为了2AH,即42。执行ADD BL,Y后我们可以由图2.2看出,BL变为了0FFH,即-1。

图2.1 执行MOV BL,X后

图2.2 执行ADD BL,Y后
将断点设置在第12行,即MOV SUM,BL,我们查看此时的内存如图2.3所示,X和Y两个存储单元分别存放在0FE6:0000H和0FE6:0001H中,SUM存储在0FE6:0002H,当执行单步执行后,其内存存储情况变化如图2.4所示,我们可以看到SUM中存储了X和Y中存的数之和,由00H变为了0FFH,即-1,数据段存储的位置为从0FE6:0000H~0FE6:0002H,大小为3字节,同时SUM中存储的数为0FFH,我们可以得出有符号数在内存中的表示形式为补码。

图2.3 执行MOV SUM,BL前的内存存储情况

图2.4 执行MOV SUM,BL后的内存存储情况

图2.5 代码段存储情况
打开反汇编,我们根据图2.5,从中可以从中读出代码段的存储位置为从0FE70H~0FE96H,大小为27字节。
●3. 编程设计实验(二)
数据段中的一个存储单元X中存放的数据为10H,编程实现将该存储单元中的数据循环左移四位后存放到数据段的另一个存储单元Y中。
实验操作及调试步骤如下:
(1)在TPC-USB环境中根据编程设计任务完成汇编源程序的编辑、编译和链接操作,生成可执行文件。
(2)结合程序调试过程自行设计调试方案,记录源程序在内存(包括数据段和代码段)中的位置、大小,以及数据段存储单元中数据的变化情况,并描述循环左移操作的实现过程。
代码:
DATA SEGMENT X DB 10H Y DB 00H DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV BL,X MOV CL,4 ROL BL,CL MOV Y,BL MOV AH,4CH INT 21H CODE ENDS END START |
我们进行单步调试,当执行完MOV BL,X后,BL中的内存变化如图3.1所示,我们可以看出执行后BL变为了10H。执行MOV CL,4后我们可以由图3.2看出,CL变为了4H。

图3.1 执行MOV BL,X后

图3.2 执行MOV CL,4后

图3.3 执行ROL BL,CL指令前

图3.4 执行ROL BL,CL指令后
通过对比图3.3和图3.4,我们可以看出在执行ROL BL,CL后,BL由10H变为了01H,FLAGS的低字节也由02H变为了03H,我们从中可以看出循环左移四次后,是以二级制数进行左移,并且将移出的最高位移动到数的最后一位,并同时移动到FLAGS中的CF位,移动的示意图如图3.5所示。

图3.6 执行MOV Y,BL后内存变化情况
根据图3.6,我们可以得出存储单元X,Y分别存放在0FE6:0000H和0FE6:0001H,大小为2字节。执行MOV Y,BL后Y中的内容变为了01H。

图3.7 代码段存储情况文章来源:https://www.toymoban.com/news/detail-421838.html
打开反汇编,我们根据图3.7,从中可以从中读出代码段的存储位置为从0FE70H~0FE95H,大小为26字节。文章来源地址https://www.toymoban.com/news/detail-421838.html
到了这里,关于实验一8086计CPU系统寻址方式和汇编语言程序设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!