//2010-06-20 22:54:39
第三章 寄存器的内存访问
3.1~3.5 小结
1,字在内存中存储时,要用两个地址连续的内存单元存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
及高高低低
2,用MOV指令访问内存单元,可以在MOV 指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
3,[address]表示一个偏移地址为address的内存单元。
4,在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
5,MOV、ADD SUB是具有两个操作对象的指令。JMP是具有一个操作对象的指令。
检测点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 //理解了好久0000:0010 和0010:0000 为什么是一样的地址
MOV BX,[0001] BX=E626
MOV AX,BX AX=E626
MOV AX,[0000] AX=2662
MOV BX,[0002] BX=D6E6
ADD AX,BX AX=FD48
ADD AX,[0004] AX=2C14
MOV AX,0 AX=0
MOV AL,[0002] AX=00E6
MOV BX,0 Bx=0
MOV BL,[000C] BX=0026
ADD AL,BL AX=000C
2,内存中的情况如图3.6所示。
各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0;
1,写出CPU执行的指令序列(用汇编指令写出).
MOV AX,6622H
JMP 0FF0:0100 ;调转到10000
MOV AX,2000H
MOV DS,AX
MOV AX,[0008]
MOV AX,[0002] ;MOV BX,AX 这条指令没被执行
2,写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
MOV AX,6622H 执行后
CS=2000H,IP=3,AX=6622,DS=1000H,BX=0
JMP 0FF0:0100 ;调转到10000 执行后
CS=0FF0H,IP=0100,DS=1000,AX=6622H,BX=0
MOV AX,2000H 执行后
CS=0FF0H,IP=0103,DS=1000,AX=2000H,BX=0
MOV DS,AX 执行后
CS=0FF0H,IP=0105,DS=2000H,AX=2000H,BX=0
MOV AX,[0008] 执行后
CS=0FF0H,IP=0108,DS=2000H,AX=C389,BX=0
MOV AX,[0002] 执行后
CS=0FF0H,IP=010B,DS=2000H,AX=EA66,BX=0
3,再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
存方形式:都是以二进制形式存方。
CS:IP 来确定代码段,DS+偏移地址来确定数据段
栈的综述
栈顶的变化范围最大为:0~FFH 8位,0~FFFFH 16位,0~FFFFFFFFH 32位,
0~FFFF FFFF FFFF FFFFH 64
1,在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实质上是一种内存传达指令,注意它们的灵活应用。
检测点3.2
1,补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到
20000H~2000FH中。
逆序复制的含义如图3.17所示(图中内存里的数据均为假设).
mov ax,1000H
mov ds,ax
mov bx,2000h
mov ss,bx
mov sp,10H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [c]
push [E]
2,补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到
20000H~2000FH中
mov ax,2000h
mov ds,ax
mov bx,1000h
mov ss,bx
mov sp,0
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
实验2 用机器指令和汇编指令编程
1,使用DEBUG,将上面的程序段写入内存,执行,根据指令执行后的实际运
行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=2200
add ax,[2] ;ax=5BEA
mov bx,[4] ;bx=0000
add bx,[6] ;bx=30f0
push ax ;sp=0100
push bx ;sp=00FE
pop ax ;sp=00FC
pop bx ;sp=00FE
push [4] ;sp=0100
push [6] ;sp=00FE