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

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

教材实验1

实验任务(1)

使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化

机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx

1.用e命令写入前两条指令

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

查看结果:

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

2.用a命令写入后两条指令

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

查看结果:

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

3.使用t命令单步调试

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

实验任务(2)

将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

mov ax,1
add ax,ax
jmp 2000:0003

1.使用a命令写入上述指令

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

2.修改CS与IP的值

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

3.使用t命令单步调试

此处只给出前两步与最后的调试结果

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

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

最终结果:AX=0100H=256(10) 即2的8次方

实验任务(3)

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

1.使用d命令查看内存FFF00H~FFFFFH内容

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

可观察到生产日期为1992年1月1日。

2.尝试修改内容

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

修改失败

失败原因:该地址为ROM地址空间(只读)

实验任务(4)

向内存从B8100H开始的单元中填写数据

写入第一组数据

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

写入第一组数据

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

可观察到第二行会出现彩色图标。

原因:8086中A0000~BFFFF为显存地址空间。

教材实验2

实验任务(1)

使用debug将下面的程序段写入内存,逐条执行

为了便于验证实验结果,做如下两点调整:

① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字
节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022

mov    ax,0022
mov    ds,ax

mov    ax,2200
mov    ss,ax

mov    sp,0100

mov    ax,[0]		;ax = 5150H
add    ax,[2]		;ax = A4A2H
mov    bx,[4]		;bx = 5554H
add    bx,[6]		;bx = ACAAH
push   ax		;sp = 00FEH      修改的内存单元的地址是 2200:00FE(220FEH)  内容为 A4A2H
push   bx		;sp = 00FCH      修改的内存单元的地址是 2200:00FC(220FCH)  内容为 ACAAH
pop    ax		;sp = 00FEH	 ax = ACAAH
pop    bx		;sp = 00FCH	 bx = A4A2H
push   [4]		;sp = 00FEH      修改的内存单元的地址是 2200:00FE(220FEH)  内容为 5554H
push   [6]		;sp = 00FCH      修改的内存单元的地址是 2200:00FC(220FCH)  内容为 5756H

调试过程:

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

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

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

书P74各个寄存器填空结果见上文代码块内容,观察得知与实际单步调试结果相符。

实验任务(2)

观察书P75图3.19的实验过程,分析:为什么 2000:0~2000:f 中的内容会发生改变?

1.使用a命令输入7行指令

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

2.修改并查看2000:0~2000:f的内容

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

3.单步调试

  1. mov ax,2000 将2000H送入寄存器ax

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

  2. mov ss,ax mov sp 10 将寄存器ax内容送入 ss (栈的段寄存器),并将sp设为10H

    mov sp,10不是省略了,而是在执行mov ss,ax时一起执行。这是为了确保对ss段寄存器和栈指针的修改不被破坏。

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

  3. mov ax,3123 将3123H送入寄存器ax

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

  4. push ax 将寄存器ax中内容压入栈

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

  5. mov ax,3366 将3366H送入寄存器ax

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

  6. push ax 将寄存器ax中内容压入栈

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

  • 分析2000:0~2000:f内容变化的原因:

    1. 单步中断时会将CS,IP入栈

    2. 指令执行将ax寄存器内容入栈

  • 前3行汇编指令的功能

    mov ax,2000	;将2000H送入寄存器ax
    mov ss,ax	;将寄存器ax内容送入ss(栈的段寄存器)
    mov sp,10	;将sp(偏移地址)设为10H
    

    初始时栈顶和栈底都为2000:0010(20010H)

  • 基于单步调试观察到的变化,给出你对此的思考及可能原因分析

    1. 这次实验d指令观察的是一段栈的内容
    2. 单步调试会引发单步中断,CPU会将一些寄存器(CS,IP)内容自动入栈
    3. 使用pushpop指令入栈出栈也会造成栈的数据更改
上一篇:JavaScript 中的时间处理详解


下一篇:酷,半透明和形状对话框与标准的控制Windows 2000及以上