实验1 用机器指令和汇编指令编程
实验1
1、教材实验1
(1)实验任务1
使用E命令写入内存:
使用R命令观察寄存器情况,并使用T命令单步执行:
使用A命令写入内存:
使用R命令观察寄存器情况,并使用T命令单步执行:
(2)实验任务2
使用A命令写入内存:
使用T命令单步执行:
由于使用无条件跳转命令jmp,计算机在完成2^8的计算后仍将继续运算。
(3)实验任务3
使用D命令查看内存地址FFFF5H至FFFFCH的内容:
可见ROM芯片为1992年1月1日生产。
尝试使用E命令修改,并再次使用D命令查看:
可见E命令得到了执行,debug程序并不报错,但内存中的值并没有变化。这是由于该位置为ROM区,向其中写入数据是无效的。
(4)实验任务4
使用E命令向内存单元中填写数据:
可见屏幕右上角出现了特殊字符,并可改变颜色。这是由于B8100H为显存所映射的地址,E命令修改了显存中的数据,使显示发生变化。
2、教材实验2
(1)实验任务1
使用E命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H:
使用A命令将程序段写入内存:
使用R命令查看寄存器状况,并使用T命令单步执行:
可见:
mov ax,0022 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax=5150 add ax,[2] ;=A4A2 mov bx,[4] ;bx=5554 add bx,[6] ;bx=ACAA push ax ;sp=00FE;修改的内存单元的地址是2200:0100,内容为A4A2 push bx ;sp=00FC;修改的内存单元的地址是2200:00FF,内容为ACAA pop ax ;ax=ACAA pop bx ;bx=A4A2 push [4] ;sp=00FE;修改的内存单元的地址是2200:0100,内容为5554 push [6] ;sp=00FC;修改的内存单元的地址是2200:00FF,内容为5756
(2)实验任务2
使用A命令将代码写入内存中,并使用D命令查看2000:0到2000:F中的内容:
使用T命令单步执行,并使用D命令查看2000:0到2000:F中的内容:
可见,其中的内容在持续变化。
这是由于
mov ax,2000 mov ss,ax mov sp,10
将栈顶设置为了2000:0010,即初始时栈顶与栈底均为2000:0010。而8086CPU中,栈是从高地址向低地址增长的,即2000:0000到2000:000F位于栈区中,因此,CPU会自动将其初始化,并使用一部分内存资源维护硬件栈。而当PUSH AX指令被执行时,AX寄存器中的值被压入栈中,栈顶元素即被修改为AX的值。