201983290098姚致远汇编语言实验一
四、实验结论
2.实验任务2
由下图可知,查看FFF00H-FFFFFH的内容后,发现最后一栏地址为FFF0:00F0的空间注释中显示的是日期,所以该地址存放的就是生产时期:

试图用e命令修改地址为FFF0:00F0的空间开头的连续五个单元的值,再用d命令查看,发现这些值并没有改变。因为ROM中的信息是由计算机制造商写入的,用户无法改写。

3.实验任务3
使用e命令,向内存单元填写数据。输出了五个红心:

使用f命令,向内存单元批量填写数据。底部输出了一整排红心:

尝试将内存单元为b800:0010开始的内存空间连续三次修改为十六进制数据02 01,用d命令可以看到数据被成功修改,并且顶部输出三个绿色微笑表情:

4.实验任务4
填空:单步执行,在执行push指令和pop指令时,观察并记录栈顶偏移地址的寄存器sp值的变化情况。

问题一:栈顶的逻辑地址是0030,物理地址是00300
问题二:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此 时栈空间数据,给出实验截图。可看出栈中已经保存了从10到80的所有数据:

问题三:pop [0] 指令执行结束后,使用d命令d 20:0 7 查看此时数据空间内的数据是否有变化。可看出数据出栈后在数据空间中以正常顺序存放:

问题四:如果把最后四条指令改成截图中的顺序,pop [6] 指令执行结束后,使用d命令 d 20:0 7 查看此时数据空间内的数据是否有变化。可看出数据出栈后以逆序存放:

5.实验任务5
问题一:不是。是在执行完mov ss,ax后执行的。
问题二:下面的图记录了每次单步执行后栈空间数据的变化情况:





可看出栈中因为指令push ax而存放了ax中的数据,除此之外还存放了每次执行指令后cs、ip两个寄存器中的内容。因为cs和ss两个寄存器具有相同的地址。
6.实验任务6
程序源码:
assume cs:code code segment start: mov cx,10 mov dl,'0' s: mov ah,2 int 21h add dl,1 loop s mov ah,4ch int 21h code ends end start
汇编:

链接:

运行:

可看出前两个字节正是CD 20:

7.实验任务7
补全源码:
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0017h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
依据:第一空,因为本程序想要完成自身代码的复制,而代码的段地址存放在cs寄存器中,所以要把cs赋值给ax;第二空,由于复制代码时每次复制一个字节,所以循环次数就等于代码的字节数。但这里我并不知道代码的字节数,所以我先随便填了一个数据0462h赋值给cx,并汇编、链接,然后用反汇编查看代码,可以看出loop指令对应的偏移地址是15,下一条指令mov ax,4c00对应的是17,所以mov之前的指令总长度为17字节:

将17填入第二空后,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令 对0:200h开始的内存单元反汇编,可看出已经把task7.asm中line3-line12的代码复制到了目标内存空间:

五、实验总结
1.我知道了向显存地址空间写入数据,数据就会被写入现存中,并被显卡输出到显示器上;若向ROM地址空间写入数据,则该操作是没有结果的。因为ROM中的数据是生产商提前写入的,用户无法修改。
2.栈具有后进先出的特点。我们可以把一段内存空间设置为栈空间。若想将数据入栈再出栈,则出栈顺序要和入栈顺序相反才能得到原来的数据。
3. CPU实模式:出现于早期8088CPU时期,由于CPU的性能有限,一共只有20位地址线,地址空间只有1MB,以及8个16位的通用寄存器,以及4个16位的段寄存器。所以为了能够通过这些16位的寄存器去构成20位的主存地址,必须采取一种特殊的方式。当某个指令想要访问某个内存地址时,它通常需要用(段基址:段偏移量)来表示。
4.CPU保护模式:随着CPU的发展,CPU的地址线的个数也从原来的20根变为现在的32根,所以可以访问的内存空间也从1MB变为现在4GB,寄存器的位数也变为32位。在保护模式下,CPU的32条地址线全部有效,可寻址高达4G字节的物理地址空间。偏移值和实模式下是一样的,就是变成了32位而已,但是段寄存器存放的却不再是段基址了,而是把这些关于内存段的限制信息放在一个叫做全局描述符表(GDT)的结构里。全局描述符表中含有一个个表项,每一个表项称为段描述符。而段寄存器在保护模式下存放的便是相当于一个数组索引的东西,通过这个索引,可以找到对应的表项。段描述符存放了段基址、段界限、内存段类型属性等许多属性。
5.CPU长模式:长模式又名 AMD64,因为这个标准是 AMD 公司最早定义的,它使 CPU 在现有的基础上有了 64 位的处理能力,既能完成 64 位的数据运算,也能寻址 64 位的地址空间 长模式寄存器 长模式依然具备保护模式绝大多数特性,如特权级和权限检查。
浙公网安备 33010602011771号