2012年12月19日 星期三 16时21分45秒 / 2014年1月26日 星期日 10时27分31秒
P129
第三章 寄存器(内存访问)
3.1 内存中字的存储
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将他们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
我们将起始地址为N的字单元称之为N地址字单元。
3.2 DS和[address]
DS寄存器通常用来存放要访问的数据的段地址。
mov al,[0]
已知的mov指令可完成的两种传送功能:
(1)将数据直接送入寄存器;
(2)将一个寄存器中的内容送入另一个寄存器中。
mov 指令 还可以将一个内存单元中的内容送入一个寄存器。
mov bx,1000H
mov ds,bx
mov al,[0]
首先将基地址1000H放入一般的寄存器,通过mov指令,将一般寄存器bx中数据送入到ds寄存器中,然后CPU通过取ds中的段地址+[0]偏移地址得到最终的内存地址,并将这个地址中的数据送入到al中。
记住:8086PC不能直接将段地址送入到ds寄存器中。
思考:
从内存单元数据送入到寄存器用 "mov 寄存器 内存单元地址",那么将寄存器的数据送入内存单元呢?
mov bx,1000H
mov ds,bx
mov [0],a1
3.3 字的传送
8086CPU是16位结构。 一次可以传递2个字节,即一个字。
3.4 mov,add,sub指令
mov 指令用法:
mov 寄存器,数据 mov ax,8
mov 寄存器,寄存器 mov ax,bx
mov 段寄存器,寄存器 mov ds,ax
mov 寄存器,段寄存器 mov,ax,ds
mov 寄存器,内存单元 mov ax,[0]
mov 内存单元,寄存器 mov [0],ax
mov 段寄存器,内存单元 mov ds,[0]
add和sub指令一样,基本上都有这样的操作。
3.5 数据段
可以将一组长度为N(N<=64KB),地址连续,起始地址为16的倍数的内存单元当作专门存储数据的空间,从而定义一个数据段。
例如可以认为123B0H---123B9H这段内存是一个数据段。实现累加这个数据段中的前3个单元中的数据。如下:
首先查看123B:0处的内存值。
-d 123B:0
123B:0000 04 22 5C 44 04 22 5C 44-04 22 BE 43 AF 21 BE 43 ."\D."\D.".C.!.C
可以看到前三个内存单元的值为,04,22,5c 则结果应该是04+22+5c=82 下面来验证是否是这个结果。
-a
13EA:010B mov ax,123B
13EA:010E mov ds,ax
13EA:0110 mov al,0
13EA:0112 add al,[0]
13EA:0116 add al,[1]
13EA:011A add al,[2]
13EA:011E
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13EA ES=13EA SS=13EA CS=13EA IP=0100 NV UP EI PL NZ NA PO NC
13EA:0100 B83B12 MOV AX,123B
-
-r ip
IP 0100
:010B
-t
AX=123B BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13EA ES=13EA SS=13EA CS=13EA IP=010E NV UP EI PL NZ NA PO NC
13EA:010E 8ED8 MOV DS,AX
-
-t
AX=123B BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=123B ES=13EA SS=13EA CS=13EA IP=0110 NV UP EI PL NZ NA PO NC
13EA:0110 B000 MOV AL,00
-t
AX=1200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=123B ES=13EA SS=13EA CS=13EA IP=0112 NV UP EI PL NZ NA PO NC
13EA:0112 02060000 ADD AL,[0000] DS:0000=04
-t
AX=1204 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=123B ES=13EA SS=13EA CS=13EA IP=0116 NV UP EI PL NZ NA PO NC
13EA:0116 02060100 ADD AL,[0001] DS:0001=22
-t
AX=1226 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=123B ES=13EA SS=13EA CS=13EA IP=011A NV UP EI PL NZ NA PO NC
13EA:011A 02060200 ADD AL,[0002] DS:0002=5C
-t
AX=1282 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=123B ES=13EA SS=13EA CS=13EA IP=011E OV UP EI NG NZ AC PE NC
13EA:011E D913 FST DWORD PTR [BP+DI] SS:0000=2
0CD
-
可以发现AL确实等于82.
3.6 栈
后进先出
3.7 CPU提供的栈机制
8086CPU的入栈和出栈都是以字为单位进行的。
-a
1386:0128 mov ax,0123
1386:0128 pus ax
1386:0128 mov bx,2266
1386:0128 pus bx
1386:0128 mov cx,1122
1386:0128 pus cx
1386:0128 pop ax
1386:0129 pop bx
1386:012A pop cx
1386:012B
-t
AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=011F OV UP EI PL NZ NA PE CY
1386:011F 50 PUSH AX
-t
AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEA BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0120 OV UP EI PL NZ NA PE CY
1386:0120 BB2602 MOV BX,0226
-t
AX=0123 BX=0226 CX=0000 DX=0000 SP=FFEA BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0123 OV UP EI PL NZ NA PE CY
1386:0123 53 PUSH BX
-t
AX=0123 BX=0226 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0124 OV UP EI PL NZ NA PE CY
1386:0124 B92211 MOV CX,1122
-t
AX=0123 BX=0226 CX=1122 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0127 OV UP EI PL NZ NA PE CY
1386:0127 51 PUSH CX
-t
AX=0123 BX=0226 CX=1122 DX=0000 SP=FFE6 BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0128 OV UP EI PL NZ NA PE CY
1386:0128 58 POP AX
-t
AX=1122 BX=0226 CX=1122 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=0129 OV UP EI PL NZ NA PE CY
1386:0129 5B POP BX
-t
AX=1122 BX=0226 CX=1122 DX=0000 SP=FFEA BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=012A OV UP EI PL NZ NA PE CY
1386:012A 59 POP CX
-t
AX=1122 BX=0226 CX=0123 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000
DS=1282 ES=13EA SS=13EA CS=1386 IP=012B OV UP EI PL NZ NA PE CY
1386:012B 0000 ADD [BX+SI],AL DS:0226=44
-
栈顶的段地址存放在段寄存器SS中,偏移地址存放在SP中。
SS:SP指向栈顶元素
8086中寄存器SS和寄存器SP分别存放栈顶的段地址和偏移地址。
当栈为空时,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的元素,该单元的偏移地址为栈最底部的字单元的偏移地址+2,若栈最底部的单元地址为1000:000E,怎空栈时,SP=0010H。
3.8 栈顶超界的问题
8086没有校验栈顶栈底的机制,所以要自己小心这方面。
3.9 push,pop指令
push|pop 段寄存器
push|pop 内存单元
push|pop 寄存器
3.10 栈段
栈段和代码段数据段一样。
如何使得如push,pop等栈操作指令访问我们定义的栈?即将SS:SP指向我们定义的栈段
实验2 用机器指令和汇编指令编程
实验一:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
2014-2-17 16:17 记 @fuxingmen.xichengqu.beijing
分享到:
相关推荐
《汇编语言》 第3章 寄存器(内存访问).ppt
汇编语言第三章寄存器(内存访问)知识点总结 本章主要讲解了寄存器在内存访问中的作用,介绍了寄存器的基本概念、内存中字的存储、DS 和 [address]、字的传送、mov、add、sub 指令、数据段、栈、CPU 提供的栈机制...
6. **地址寄存器**:在内存访问过程中,地址寄存器用于保存要读取或写入的内存地址。 7. **浮点寄存器**:专门用于存储浮点数,与通用寄存器类似,但处理的是小数而非整数。 CPU的工作流程大致如下:首先,PC从...
"汇编语言第2章寄存器(CPU工作原理)" 本资源主要讲解了汇编语言中寄存器的概念和工作原理,包括通用寄存器、寄存器中的数据存储、寄存器的逻辑结构、16位结构的CPU、物理地址等概念。通过本资源,读者可以了解...
- **使用`__attribute__((section(".sectname")))`属性**:通过此属性可以将变量放在特定的内存区域中,便于直接访问寄存器。 - **使用指针操作**:定义指向寄存器地址的指针,通过该指针进行读写操作。 ##### 2. ...
在讨论王道操作系统思维导图第三章的内存管理时,我们将会触及操作系统中的核心概念之一——内存管理。内存管理是操作系统中负责管理计算机系统中主存储器资源的重要功能,它涉及如何有效地分配、使用和回收内存空间...
操作系统第三章内存管理 操作系统第三章内存管理是计算机科学中的一门重要课程,涉及到计算机系统中内存管理的各种机制和算法。本章节将详细介绍内存管理的基本概念、内存分配方式、内存保护机制、虚拟内存技术等...
`devmem`工具是Linux内核提供的一种实用程序,允许用户空间程序直接访问物理内存,从而能够读写特定地址的寄存器。本文将深入探讨如何使用`devmem`来读取寄存器值,以及相关的知识点。 ### 1. `devmem`工具介绍 `...
第3章 寄存器(内存访问) 3.1 内存中字的存储 3.2 DS 31:1[address] 3.3 字的传送 3.4 ITIOV、add、sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制 3.8 栈顶超界的问题 3.9 puSh、pop...
第3章 寄存器(内存访问) 3.1 内存中字的存储 3.2 DS 31:1[address] 3.3 字的传送 3.4 ITIOV、add、sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制 3.8 栈顶超界的问题 3.9 puSh、pop...
第3章 寄存器(内存访问) 3.1 内存中字的存储 3.2 DS 31:1[address] 3.3 字的传送 3.4 ITIOV、add、sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制 3.8 栈顶超界的问题 3.9 puSh、pop...
- **DX(数据寄存器)**:通常用作第二个操作数寄存器,在乘法和除法指令中特别有用。 所有这些数据寄存器都可以被拆分为高8位和低8位两部分使用,例如AX可拆分为AH(高8位)和AL(低8位)。 - **指针寄存器**: ...
本作业答案涵盖了汇编语言第三章的相关知识点,包括立即操作数、寄存器操作数、存储器操作数、寻址方式、物理地址计算、指令执行结果比较、段超越前缀的用法等。 1. 操作数类型 在汇编语言中,操作数可以分为三种...
文档还强调用户在使用此文档中的信息时不应将其用于确定实施是否侵犯第三方专利的目的。 ### 总结 ARM v8-A 架构是 ARM 处理器设计中的一个重要里程碑,通过引入 64 位计算能力和增强的安全特性,为各种高性能计算...
### Win32汇编寄存器的详细说明 在探讨Win32环境下汇编语言中的寄存器使用之前...而段寄存器如CS、DS、SS、ES、FS和GS则用于管理内存访问。 理解这些寄存器的功能和使用场景是编写高效、可靠的Win32汇编程序的基础。
第3章 寄存器(内存访问) 3.1 内存中字的存储 3.2 DS和[address] 3.3 字的传送 3.4 mov、add、sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制. 3.8 栈顶超界的问题 3.9 push、pop指令 3.10 栈段 实验2 ...
第3章 寄存器(内存访问) 第4章 第一个程序 第5章 [BX]和loop指令 第6章 包含多个段的程序 第7章 更灵活的定位内存地址的方法 第8章 数据处理的两个基本问题 第9章 转移指令的原理 第10章 CALL和RET指令 第...
MCS51支持4组工作寄存器,每组包含8个寄存器,这里提到的是第三组。 - **10H~17H**:寄存器组2。 - **08H~0FH**:寄存器组1。 - **00H~07H**:寄存器组0。 寄存器组的选择通过程序状态字(PSW)中的RS1和RS0位进行...
3. 访问方式不同:寄存器由CPU直接读写,而存储器则通过地址总线进行寻址访问。 4. 空间大小不同:寄存器数量有限,每个寄存器通常为16位或32位,而存储器容量较大,可以扩展到数十亿字节。 8086CPU使用段地址+偏移...
第3章 寄存器(内存访问) 3.1 内存中字的存储 3.2 DS 31:1[address] 3.3 字的传送 3.4 ITIOV、add、sub指令 3.5 数据段 3.6 栈 3.7 CPU提供的栈机制 3.8 栈顶超界的问题 3.9 puSh、pop...