找回密码
 register

QQ登录

只需一步,快速开始

查看: 21|回复: 2

[汇编语言] [零基础入门学习]·18·寄存器(内存访问)·实验2用机器指令和汇编指令编程

[复制链接]

[汇编语言] [零基础入门学习]·18·寄存器(内存访问)·实验2用机器指令和汇编指令编程

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2024-12-30 20:01 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

实验2 用机器指令和汇编指令编程

一、预备知识:debug的使用

前面实验中,讲了Debug一些主要命令的用法,这里,再补充一些关于Debug的知识。

(1)关于D命令。
从上次实验中,我们知道,D命令是查看内存单元的命令,可以用“d 段地址:偏移地址”的格式查看指定的内存单元的内容,上次实验中,D命令后面的段地址和偏移地址都是直接给出的。

现在,我们知道段地址是放在段寄存器中的,在D命令后面直接给出段地址,是Debug提供的一种直观的操作方式。D命令是由Debug执行的,Debug在执行“d 1000:0”这样的命令时,也会先将段地址1000H送入寄存器中。

Debug是靠什么来执行D命令的?当然是一段程序。

谁来执行这段程序?当然是CPU。
CPU访问内存单元的时候从哪里得到内存单元的段地址?从段寄存器中得到。

所以,Debug在其处理D命令的程序段中,必须有将段地址送入段寄存器的代码。

段寄存器有4个:CS、DS、SS、ES,将段地址送入哪个段寄存器呢?

首先不能是CS,因为CS:IP必须指向Debug处理D命令的代码,也不能是SS,因为SS:SP要指向栈顶。这样只剩下DS和ES可以选择,放在哪里呢?我们知道,访问内存的指令如“mov ax,[0]”等一般都默认段地址在DS中,所以Debug在执行如“d 段地址:偏移地址”这种D命令时,将段地址送入ds中比较方便。

D命令也提供了一种符合CPU机理的格式:“d 段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从 SA:偏移地址开始的内存区间中的数据。以下是几个例子。

001.webp

(2)在E、A、U命令中使用段寄存器。
004.webp

(3)下一条指令执行了吗?
在Debug中,用A命令写一段程序:

mov ax,2000
mov ss,ax
mov sp,10       ;安排2000:0000~2000:000F为栈空间,初始化栈顶
mov ax,3123
push ax
mov ax,3366 
push ax         ;在栈中压入两个数据

仔细看一下图3.18中单步执行的结果,你发现了什么问题?

10.webp
图3.18  mov sp,10 到哪里去了?

在用T命令单步执行mov ax,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:mov ss,ax;
在用T命令单步执行mov ss,ax后,显示出当前CPU各个寄存器的状态和下一步执行的指令......,在这里我们发现一个问题:mov ss,ax的下一条指令应该是mov sp,10,怎么变成了mov ax,3123?

mov sp,10到哪里去了?它被执行了吗?

我们再仔细观察,发现:

在程序执行前,ax=0000,ss=0b39,sp=ffee
在用T命令单步执行mov ax,2000后,ax=2000,ss=0b39,sp=ffee
在用T命令单步执行mov ss,ax后,ax=2000;ss=2000;sp=0010

注意,在用T命令单步执行mov ss,ax前,ss=0b39,sp=ffee,而执行后,ss=2000,sp=0010。ss变为2000是正常的,这正是mov ss,ax的执行结果。可是sp变为0010是怎么回事?在这器件,能够将sp设为0010的只有指令mov sp,10,看来,mov sp,10一定得到了执行。

那么,mov sp,10是在什么时候被执行的呢?当然是在mov ss,ax之后,因为它就是mov ss,ax的下一条指令。显然,在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。

整理一下我们分析的结果:在用T命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但T命令执行mov ss,ax的时候,没有做到这一点。

不单是mov ss,ax,对于mov ss,bx,mov ss,[0],pop ss等指令都会发生上面的情况,这些指令都有哪些共性呢?它们都是修改栈段寄存器SS的指令。

为什么会这样呢?要想彻底说清楚这里面的来龙去脉,在这里还为时尚早,因为这涉及我们在以后的课程中要深入研究的内容:中断机制,它是我们后半部分课程中的一个主题。现在我们只要知道这一点就可以了:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

二、实验任务

(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

mov ax,ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]      ;ax=________
mov ax,[2]      ;ax=________
mov ax,[4]      ;bx=________
mov ax,[6]      ;bx=________

push ax         ;sp=________;修改的内存单元的地址是______内容为______
push bx         ;sp=________;修改的内存单元的地址是______内容为______
pop ax          ;sp=________;ax=_____
pop bx          ;sp=________;bx=_____

push [4]        ;sp=________;修改的内存单元的地址是______内容为______
push [6]        ;sp=________;修改的内存单元的地址是______内容为______

(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

可以要再做些实验才能发现其中的规律。如果你在这里就正确回答了这些问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。

123.webp

  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
楼主
Waylee 楼主

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2024-12-30 22:58 | 显示全部楼层 | Google Chrome | Windows 10

二、实验任务 实验记录

(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

特别说明:由于笔者的实验环境是在DOSBOX上进行实验的。不同机器的ROM配置可能不相同,因此 FFFF:0000~0000F 这一段的信息可能不相同,因此实验结果不尽相同。但只要是正确的操作,答案都是正确的。

mov ax,ffff
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]      ;ax=COEA(答案不唯一)
mov ax,[2]      ;ax=0012(答案不唯一)
mov ax,[4]      ;bx=30F0(答案不唯一)
mov ax,[6]      ;bx=2F31(答案不唯一)

push ax         ;sp=00FE;修改的内存单元的地址是220FE 内容为0012(答案不唯一)
push bx         ;sp=00FC;修改的内存单元的地址是220FC 内容为2F31(答案不唯一)
pop ax          ;sp=00FE;ax=2F31(答案不唯一)
pop bx          ;sp=0100;bx=0012(答案不唯一)

push [4]        ;sp=00FE;修改的内存单元的地址是220FE 内容为30F0(答案不唯一)
push [6]        ;sp=00FC;修改的内存单元的地址是220FC 内容为2F31(答案不唯一)

  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
楼主
Waylee 楼主

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2024-12-30 23:12 | 显示全部楼层 | Google Chrome | Windows 10

(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

可以要再做些实验才能发现其中的规律。如果你在这里就正确回答了这些问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。
b471f0f24bf3becaa2e946514b86909b.webp
由图分析可知,CS、IP的内容在执行mov ss,ax 指令后入栈了。这是为什么呢?为什么在执行前一条指令执行后CS、IP的内容没有入栈?

注意,CS、IP入栈是在mov ss,ax 执行后才在栈段20000H显示出来。也就是说,CS、IP的内容在前一条指令 mov ax,2000 后 CS、IP 的内容其实也入栈了,只不过当时的栈段处于 SS = 1269H SP = FFEE 位置处,CS、IP的内容保存在了那里。在执行mov ss,ax后,栈段改为 SS = 2000H SP = 0010H 位置了。

那么剩下的 0BEEH 和  0020H又是什么?这一部分涉及到了单步中断,笔者一开始对这一部分也不是很了解,这一部分在后面王爽老师12.11 章节王爽老师作出了解答。解答如下:

基本上,CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的类型码为1,则它所引发的中断过程如下:

1) 取得中断类型码1;

2)标志寄存器入栈,TF、IF设置为0

3)CS、IP入栈

4)(IP)=(14), (CS)=(14+2)。

Debug的实现就是提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。然后,在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这些指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被现实在屏幕上,并且等待输入命令。

CPU在进入中断处理程序之前,设置TF=0。这样是为了避免CPU在执行中断处理程序的时候发生单步中断。这就是为什么在中断过程中有TF=0这个步骤。

其实看不懂也没有关系,随着我们对中断的深入学习就会理解了。


参考文章:
https://blog.csdn.net/basketball616/article/details/122104476

您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-15 17:12 , Processed in 0.117176 second(s), 9 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表