汇编语言.实验1
实验任务2
查看生产日期

在FFFF:5-FFFF:C的这一段内存中,存储有生产日期01/01/92
修改并查看生产日期

修改内容是33/33/33,但是实际上,FFFF:5-FFFF:C这一段内容没有改变
结论
生产日期似乎不能被改变,但是这里的其他内存单元不知道能否改变。
为此,我还修改了FFFF:D这一内存单元的内容,结果如下图所示

显然,并不能改变它的内容。
在查阅了课本的13页后得知,我们向地址C000~FFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容
实验任务3
e命令修改
修改前

修改后

f命令修改
修改后

结论
同样的,在实验任务3所在的1.15节的13页,课本指出了向地址A0000~BFFFF的内存单元中写数据,就是向显存中写入数据,这些数据会显示在显示器上。
这里再使用r命令,得出的结果如图所示:

之前显示的内容有一部分被改写了,然而没有改写的内容还存在于命令行中。
根据之前修改的内容,即
-e b800:0 03 04 03 04 03 04 03 04 03 04
-f b800:0f00 0f9f 03 04
那么可以推测,当前屏幕的显存地址是b8000~b8f9f,第一行的起始地址是b8000,最后一行的起始地址是b8f00,每一行的长度为A0。计算可以得出,一行有160个显示位(0~159),一个页面有25行(0~24)。如果用字符铺满一行,总共需要80个字符,即,一个字符占两个显示位。

根据上述分析,可以推测出,对于一个x行,y字符位置的字符,它在内存中的物理位置是:
比如现在要在8行的0字符处显示数字1,推测指令为-e b800:500 31,结果为:

实验任务4
填空
-a
mov ax, 20
mov ds, ax
mov ss, ax
mov sp, 30
push [0] ; 执行后,寄存器(sp) = ____2E
push [2] ; 执行后,寄存器(sp) = ____2C
push [4] ; 执行后,寄存器(sp) = ____2A
push [6] ; 执行后,寄存器(sp) = ____28
pop [6] ; 执行后,寄存器(sp) = ____2A
pop [4] ; 执行后,寄存器(sp) = ____2C
pop [2] ; 执行后,寄存器(sp) = ____2E
pop [0] ; 执行后,寄存器(sp) = ____30
问题
问题1:逻辑地址0030,物理地址00230
问题2:

问题3:
并没有变化

问题4:
变化了,数据按字单元的顺序被倒置了

实验任务5
问题1

根据截图得知,在使用了第二次-t命令之后,cs:ip所指向的下一道指令是mov ax, 2010,而不是本来跟在mov ss, ax之后的mov sp, 30。据此,将ss内容送入后,sp内容立即被送入,并没有根据t命令的规则停止。
根据课本74页,这里涉及到了中断机制
问题2


虽然并没有对ss:sp的前六个内存单元进行修改,但是随着指令的执行,这三个字其中的前两个字单元中的数据会不断地改变。
综合看来,push指令似乎会修改其指向的内存单元的前面8个内存单元,即四个字,分别是cs ss 固定值 操作数。
实验任务6
源代码

masm

link

运行结果

程序的功能是输出0123456789
查看PSP

前两个字节是CD 20
实验任务7
问题1
- 076AH
- 24
第一个空的作用是指定段地址,根据上下文,已经在es中放入了要将指令装入的位置,那么ds中应该是放入的程序的段地址,根据上一题得知,程序的段地址应该是076A:

第二个空的作用是指定循环的次数,循环内部的作用是从ds:[bx]中找一个字节存入到es:[bx]中,那么循环的次数显然就是mov ax, 4c00h之前的字节数了,由于操作数并不影响指令长度,这个值可以在程序编译链接后用debug查看。
因此本题的策略是在保证程序语法正确的情况下,在debug中用r命令查看ds,并且用u命令找到mov ax, 4c00h的地址,减去第一行的代码的地址即可。

因此,第一空为076AH,第二空为十六进制的18即十进制的24。
运行结果


上一图是g命令执行,二图是用u命令查看0:200~0:218之间指令,前十八个字节确实转存了代码中指定的内容。下面是代码:


浙公网安备 33010602011771号