汇编语言.实验1

实验任务2

查看生产日期

image

FFFF:5-FFFF:C的这一段内存中,存储有生产日期01/01/92

修改并查看生产日期

image

修改内容是33/33/33,但是实际上,FFFF:5-FFFF:C这一段内容没有改变

结论

生产日期似乎不能被改变,但是这里的其他内存单元不知道能否改变。

为此,我还修改了FFFF:D这一内存单元的内容,结果如下图所示

image

显然,并不能改变它的内容。

在查阅了课本的13页后得知,我们向地址C000~FFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容

实验任务3

e命令修改

修改前

image

修改后

image

f命令修改

修改后

image

结论

同样的,在实验任务3所在的1.15节的13页,课本指出了向地址A0000~BFFFF的内存单元中写数据,就是向显存中写入数据,这些数据会显示在显示器上。

这里再使用r命令,得出的结果如图所示:

image

之前显示的内容有一部分被改写了,然而没有改写的内容还存在于命令行中。

根据之前修改的内容,即

-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个字符,即,一个字符占两个显示位。

image

根据上述分析,可以推测出,对于一个x行,y字符位置的字符,它在内存中的物理位置是:

\[address=b8000_h + x_h*A0+y_h*2 \]

比如现在要在8行的0字符处显示数字1,推测指令为-e b800:500 31,结果为:

image

实验任务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:

image

问题3:

并没有变化

image

问题4:

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

image

实验任务5

问题1

image

根据截图得知,在使用了第二次-t命令之后,cs:ip所指向的下一道指令是mov ax, 2010,而不是本来跟在mov ss, ax之后的mov sp, 30。据此,将ss内容送入后,sp内容立即被送入,并没有根据t命令的规则停止。

根据课本74页,这里涉及到了中断机制

问题2

image

image

虽然并没有对ss:sp的前六个内存单元进行修改,但是随着指令的执行,这三个字其中的前两个字单元中的数据会不断地改变。

综合看来,push指令似乎会修改其指向的内存单元的前面8个内存单元,即四个字,分别是cs ss 固定值 操作数

实验任务6

源代码

image

masm

image

image

运行结果

image

程序的功能是输出0123456789

查看PSP

image

前两个字节是CD 20

实验任务7

问题1

  1. 076AH
  2. 24

第一个空的作用是指定段地址,根据上下文,已经在es中放入了要将指令装入的位置,那么ds中应该是放入的程序的段地址,根据上一题得知,程序的段地址应该是076A

image

第二个空的作用是指定循环的次数,循环内部的作用是从ds:[bx]中找一个字节存入到es:[bx]中,那么循环的次数显然就是mov ax, 4c00h之前的字节数了,由于操作数并不影响指令长度,这个值可以在程序编译链接后用debug查看。

因此本题的策略是在保证程序语法正确的情况下,在debug中用r命令查看ds,并且用u命令找到mov ax, 4c00h的地址,减去第一行的代码的地址即可。

image

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

运行结果

image

image

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

image

posted @ 2021-10-20 21:29  萤追月  阅读(100)  评论(1)    收藏  举报