《汇编语言》学习(三)内存访问

时间:2021-06-13 01:26:36

    《汇编语言》第三章主要介绍CPU对内存的访问方式:通用内存访问方式和栈内存访问方式。通用内存和栈内存只是访问方式不同,在存储器上没有区别。CPU对内存的访问都是通过“段+偏移”的方式,其中通用内存访问方式,应用的是DS寄存器指定待访问内存的段地址,偏移量直接用数值表示,相关的指令是“mov指令”;而栈内存访问方式,通过SS指定栈空间的段地址,SP指定偏移量,相关的指令是“push/pop”。本文将给出《汇编语言》第三章的习题答案和知识点总结。

一、习题答案

检测点3.1

1,在debug中,用“d 0:0 1f”查看内存,结果如下:

0000:0000    70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60

0000:0010    62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88


下面的程序执行之前,AX = 0, BX = 0,写出每条汇编指令执行完后相关寄存器的值

mov ax,1

mov ds,ax

mov ax,[0000]        AX = 2662 H

mov bx,[0001]        BX = E626 H

mov ax,bx               AX = E626 H

mov ax,[0000]        AX =2662 H

mov bx,[0002]        BX =D6E6 H

add ax,bx               AX =FD48 H

add ax,[0004]         AX =2C14 H

mov ax,0                 AX =0000 H

mov al,[0002]          AX =00E6 H

mov bx,0                 BX =0000 H

mov bl,[000C]         BX =0026 H

add al,bl                  AX =000C H


2,看内存图,各寄存器初始值:CS = 2000H, IP = 0, DS = 1000H, AX = 0, BX = 0;

(1)写出CPU执行的指令序列

mov ax,6622H

jmp 0ff0:0100

mov ax,2000H

mov ds,ax

mov ax,[0008]

mov ax,[0002]


(2)写出CPU执行每条指令后,CS、IP和相关寄存器中的值

mov ax,6622H         CS = 2000H, IP = 0003H, AX = 6622H

jmp 0ff0:0100          CS = 0FF0H, IP = 0010H

mov ax,2000H         CS =0FF0H, IP =0013H, AX = 2000H

mov ds,ax                CS = 0FF0H, IP = 0015H, DS = 2000H

mov ax,[0008]          CS = 0FF0H, IP = 0018H, AX = C389H

mov ax,[0002]          CS = 0FF0H, IP = 001BH, AX = EA66H


(3)再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

    从这段程序来看,数据和程序在内存没有区别,都是二进制信息。这些二进制数,在该段程序中,前半部分是作为指令,后半部分是作为数据。

    要确定内存中的信息是数据或程序,需要比较CS或DS的值与内存地址。


检测点3.2

1,按字逆序复制

mov ax,1000H

mov ds,ax

mov ax,2000H

mov ss,ax

mov sp,0010H

push [0]

push [2]

push [4]

push [6]

push [8]

push [A]

push [C]

push [E]


2,按字逆序复制

mov ax,2000H

mov ds,ax

mov ax,1000H

mov ss,ax

mov sp,0000H

pop [E]

pop [C]

pop [A]

pop [8]

pop [6]

pop [4]

pop [2]

pop [0]


注意:出栈时和入栈时的顺序,空栈时和满栈时的栈顶位置。

二、知识图谱

《汇编语言》学习(三)内存访问


3.1 - 3.5小结

1,字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节放在低地址单元中,高位字节存放高地址单元中。

2,用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

3,[address]表示一个偏移地址为address的内存单元。

4,在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。

5,mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

6,可以根据自己的推测,在debug中实验指令的新格式。


栈的综述

1,8086CPU提供了栈操作机制,方案如下。

    在SS、SP中存放栈顶的段地址和偏移地址;

    提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。

2,push指令的执行步骤:1)SP = SP - 2;2)向SS:SP指向的字单元送入数据。

3,pop指令的执行步骤:1)从SS:SP指向的字单元中读取数据;2)SP = SP + 2。

4,任意时刻,SS:SP指向栈顶元素。

5,8086CPU只记录栈顶,栈空间的大小我们要自己管理。

6,用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。

7,push、pop实质上是一种内存传送指令,注意它们的灵活应用。


段的综述

    一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是。关键在于CPU中寄存器的设置,即CS、IP、SS、SP、DS的指向。

《汇编语言》学习(三)内存访问