(五)《汇编语言(王爽)》 | 实验 2:用机器指令和汇编指令编程


1. 预备知识

  • 实验1 中提到,Debug 中的指令 d 段地址:偏移地址可查看相应内存单元的值,而其中的段地址其实是存放在 DS 寄存器中。同时,d 指令也提供了一种 CPU 机理的格式:d 段寄存器:偏移地址,其中段寄存器可以是 CS、DS、SS 等,如:
d ds:0	# 查看段地址:0开始的内存区间中的内容
d cs:0	# 查看当前代码段中的指令代码
d ss:0	# 查看当前栈段中的内容
  • 同理,e、a、u 等可以带有内存单元的指令中,也可以同 d 指令一样,用段寄存器表示内存单元的段地址。

  • t 指令在修改表示栈段的寄存器 SS 的指令时,下一条指令也紧接着被执行。


2. 实验任务

(1)根据逐条执行指令,写出指令执行完成后的情况。首先,使用 Debug 指令查看相关内存的内容:

请添加图片描述

指令AXBXSP修改的内存单元地址修改的内存单元内容
mov ax,ffffFFFF----
mov ds,axFFFF----
mov ax,22002200----
mov ss,ax2200----
mov sp,01002200-0100--
mov ax,[0]C0EA(FFFF:0000)-0100--
add ax,[2]C0FC-0100--
mov bx,[4]C0FC30F0(FFFF:0004)0100--
add bx,[6]C0FC60210100--
push axC0FC602100FE2200:00FE 00FFC0FC
push bxC0FC602100FC2200:00FC 00FD6021
pop ax6021602100FE--
pop bx6021C0FC0100--
push [4]6021C0FC00FE2200:00FE 00FF30F0
push [6]6021C0FC00FC2200:00FC 00FD2F31

说明:SS=2200、SP=0100 表示栈空状态,段寄存器 DS=FFFF:

  • 第 6 行,将 FFFF:0000 内存单元的值送入寄存器 AX;
  • 第 8 行,将 FFFF:0004 内存单元的值送入寄存器 BX;
  • 第 10 行,元素入栈,SP=00FE(0100 - 2),2200:00FF 存放 C0、2000:00FE 存放 FC(大端,下同);
  • 第 12 行,当前 SP=2200、SP=00FC,所以将 2200:00FD 的值 60 和 2200:00FC 的值 21 送入寄存器 AX 中,且 SP=00FE(00FC + 2);
  • 第 14 行,将 FFFF:0004 内存单元的值入栈,2200:00FF=30、2200:00FE=F0,且 SP=00FE(0100 - 2)。

(2)在没有认为对 2000:0~2000:F 内存单元值更改的情况下,这部分值自动发生了变化。如下图,前四条指令是:

mov ax,2000
mov ss,ax
mov sp,10

只执行了两次 t 指令,程序却已完成三条语句的内容(SP 寄存器内容已更改),指令 mov sp,10 自动执行了,这和预备知识里的最后一点一致,文中提到这与中断机制有关,从而更改了相关内存单元的值。

请添加图片描述


  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值