实验1 用机器指令和汇编指令编程
实验1 用机器指令和汇编指令编程
1(1)
A命令写入

E命令写入

U命令反汇编验证E命令写入结果的正确

单步调试结果

1(2)
A命令写入

根据计算,\(2^{8}\)一共需要16步,即16次单步调试,为了避免繁琐,我们使用-t 10来运行16次
单步调试第一次结果

单步调试最终结果

1(3)
查询ROM结果

尝试修改ROM后的结果

1(4)
即尝试修改显存中的部分值,
输入0101020203030404,结果如下

输入0404050506060708,结果如下

输入0104020303020401,结果如下

根据结果不难得出,数字一共有4组,相邻的两个为一组,这两个数中,第一个决定图形的形状,第二个决定图形的颜色。
2(1)
首先进行理论分析,以下是理论分析的结果:
理论分析:
mov ax,[0] ;ax = 5150
add ax,[2] ;ax = a4a2
mov bx,[4] ;bx = 5554
add bx,[6] ;bx = acaa
push ax ;sp = 00FE;修改的内存单元地址是2200:00FF,内容是a4a2
push bx ;sp = 00FC;修改的内存单元地址是2200:00FE,内容是acaa
pop ax ;sp = 00FE; ax = acaa
pop bx ;sp = 0100; bx = a4a2
push [4] ;sp = 00FE;修改的内存单元地址是2200:00FF,内容是5554
push [6] ;sp = 00FC;修改的内存单元地址是2200:00FF,内容是5756
然后进行实际操作
先使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作

再使用 a 命令输入的 p74 指令

再对每一行指令单步调试
首先展示前四步单步调试,这里一共进行了5个命令的操作,因为在第四步的mov ss后的下一条指令被立刻执行了,这里与中断机制有关

然后是剩余的单步调试,列举如下



单步调试的结果与理论分析的一致。
2(2)
先用a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及查看修改后的部分

然后单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看2000:0~2000:f 的值


文字结论:
前3行汇编指令的功能为
mov ax,2000 把2000复制给寄存器ax
mov ss,ax 把ax的值给栈顶段地址寄存器ss,即把2000给ss
mov sp,10 把10赋值给栈顶偏移地址寄存器sp
mov sp, 10意味着设置初始的栈顶偏移地址,
初始时栈顶为20010,栈底为20000
原因解释: 经过测试发现,在栈顶的数字对应着CS IP和AX,但测试中BX并不在这些地方,初步猜测系统使用栈空余的位置暂存了AX,CS,IP等数据的数值。
总结与反思:
本次实验学习了U,T,E,A,D,G等多个命令的使用,学会了用这些命令来在debug模式下进行操作寄存器和内存单元。同时,在实验二中,学会了栈相关的内容, 了解了SS和SP,并且理解了PUSH POP命令的运行原理和结果。核心还是要理解各个数据存放的位置以及命令执行的原理(指通过CS IP指针的位置进行执行并且每次执行完毕自动加一便于下一次执行)。
浙公网安备 33010602011771号