汇编语言-实验3

一、实验目的

  1. 掌握Debug常见指令的使用,以及跟踪程序的运行。
  2. 掌握待执行指令地址的形成方法。
  3. 掌握物理地址的形成方法。
  4. 掌握数据段段基址的设置方法。

二、实验过程和结果

  • 1:用“d 段寄存器:偏移地址”的格式查看内存单元。 能不能用另外的格式查看呢,例如:
d ds:偏移地址
d es:偏移地址
d ds:ax
d cs:偏移地址
d cs:ip
d cs:ax
d ss:偏移地址
d ss:ip
d ss:ax
d ax:偏移地址
dds:bp

思考1:请总结,那种类型可以实现,哪种类型不能实现

d ds:偏移地址   ——可以实现
d es:偏移地址   ——可以实现
d ds:ax      ——不可以实现
d cs:偏移地址   ——可以实现
d cs:ip      ——不可以实现
d cs:ax      ——不可以实现
d ss:偏移地址   ——可以实现
d ss:ip      ——不可以实现
d ss:ax      ——不可以实现
d ax:偏移地址 ——不可以实现
d ds:bp      ——不可以实现

2: 尝试e命令、a命令、u命令后加上“段寄存器:偏移地址”的形式执行。
可执行
3:在内存中15F0:0120处写入如下汇编指令,并执行。

  • 思考2:用T命令执行指令前,需要完成什么设置?
R 命令修改CS和IP的值为15F0:0120
A命令写入汇编指令

4:完成上题后,输入q命令,退出debug,再进入。在内存中15F0:0120处写入如下汇编指令:

  • 思考3:用T命令执行上图中第一条
    (mov ax,1234h)、第三条(mov cx,12h)和第四条(mov dx,34h)指令,不执行第二条(mov bx,5678h)指令,如何操作?(能用jmp吗)
用T 命令执行完第一条指令之后,强行修改IP的值为0126,
在接着用T命令执行后面的汇编指令

5:在内存14F0:0110处中写入如下数据:

  • 思考4:可以将这些数据当作指令执行吗,怎么做?(可截图,也可以文字描述)
先用e 命令修改内存数据,在14F00110 处写入数据
再用 r 命令修改CS和IP的值为14f0:0110
再用 t 命令执行

6: 修改段寄存器的值

  • r命令修改ds太暴力了,请尝试用mov指令修改ds的值。执行指令后,看看ds的值是否变成了想要的样子。
  • 思考5:请写下你的思考过程。
先用 a 命令写两条mov 指令
再用 r 命令修改CS和IP的值
最后用 t 命令执行

7:用E命令在内存16F0:0110处写入如下十六进制数据:
00123456789ABCDE
在自己指定的位置输入如下汇编指令,先不要执行

mov	ax,	16f0
mov	ds,	ax
mov	ax,	[0110]
mov	bx,	[0112]
mov	cx,	[0114]
mov	dx,	[0116]
mov	[0110],	dh
mov	[0112],	ch
mov	[0114],	bh
mov	[0116],	ah
  • 思考6:猜测执行上述指令后内存16F0:0110处的数据是:
  • 0012
  • 思考7:猜测执行上述指令后四个通用寄存器数据如下:
低地址对应低位,高地址对应高位
AX=1200  BX=5634  CX=9A78  DX=DEBC

执行上述指令,查看自己的猜测是否跟结果一致

  • 思考8:请总结自己出错的原因或者嘚瑟一下自己没有出错(出错不可怕,可怕的是不思考)
在另外的位置,DS的值被修改了,修改成了16f0,
然后用t命令执行了汇编指令,那么在16F00110
处的数据也跟着另外位置的指令的执行修改了内存
数据,换句话说,可能在我指定的位置执行的指令
就是要改变16f0:0110处的数据(我的个人看法仅此而已)

8:上题的改版。请用q退出debug后执行以下操作:
用E命令在内存16F0:0110处写入如下十六进制数据:
00123456789ABCDE
在自己指定的位置输入如下汇编指令

mov	ax,	[0110]
mov	bx,	[0112]
mov	cx,	[0114]
mov	dx,	[0116]
mov	[0110],	dh
mov	[0112],	ch
mov	[0114],	bh
mov	[0116],	ah

执行上述指令

  • 思考9:改版后的结果跟原来的结果一致吗?为什么会出现这种情况?
不一样,因为原版中用了两条MOV 指令修改了ds 的值,
[0110]对应DS
mov	ax,	16f0
mov	ds,	ax

而改版之后的汇编指令没有修改ds 的值,所以t 命令
执行不影响四个通用寄存器的值,也不影响16f0:0110处的数据

9:再玩一次自己的生日数字。
①用e命令请将自己的生日年月日(BCD码或者ASCII码)写入地址是16ff:0210开始的内存中。
②在内存中写入(将ds寄存器设置成16ff的)mov指令。
思考10:需要写入几条mov指令,这些指令是什么?
写两条指令
MOV ax,16ff
MOV ds,ax

  • 思考11:这些mov指令写在哪里比较合适?请给出地址和理由。
写在16ff:0210之外的其他地址 我指定的位置:12f0:0000
如果写在这个16ff:0210地址下,会把原先写的数据覆盖

③在内存中写入(将内存中地址是16ff:0210的两个字类型数据或者四个字节类型数据传送给寄存器AX和BX的)mov指令。

  • 思考12:需要写入几条mov指令,这些指令是什么?
需要写四条指令
MOV ax,16ff
MOV ds,ax
MOV ax,[0210]
MOV bx,[0212]

④执行上述写入的指令,并查看运行结果。

  • 思考13:你的这些mov指令写在了哪里?执行指令前,需要进行哪些设置?
我写在:12ff:0000
首先,我们用a命令在12ff:0000处写入MOV指令
然后,我们用r命令修改CS和IP的值为12FF:0000
最后,用t命令执行

10:逆序存放数值。(这个题目有难度)
①用e命令请将 47 4F 4F 44 20 53 54 55 44 59 写入地址是17ff:0110开始的内存中。
②用t命令写入几条指令。这些指令实现的功能如下:将17ff:0110开始的内存中的数据逆序放入地址是13ff:0110开始的内存中。提示:不能使用mov指令将内存中的数据传送到内存中,需要用寄存器当做中间媒介。每次转送的数据应设置多大呢?数据段寄存器是一直不变还是中途要修改?
③用d命令查看内存,看看结果是否如下图所示。

  • 思考14:请将你的指令写在下方,不要截图哦。
Mov ax,17ff
Mov ds,ax
Mov ah,[0119]
Mov al,[0118]
Mov bh,[0117]
Mov bl,[0116]
Mov ch,[0115]
Mov cl,[0114]
Mov dx,13ff
Mov ds,dx
Mov [0110],ah
Mov [0111],al
Mov [0112],bh
Mov [0113],bl
Mov [0114],ch
Mov [0115],cl
Mov ax,17ff
Mov ds,ax
Mov ah,[0113]
Mov al,[0112]
Mov bh,[0111]
Mov bl,[0110]
Mov cx,13ff
Mov ds,cx
Mov [0116],ah
Mov [0117],al
Mov [0118],bh
Mov [0119],bl
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年游四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值