《汇编语言》第三章主要介绍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的指向。