汇编语言学习1-3

echoker 2024-11-28 00:42:55
Categories: Tags:

CPU、存储器与总线

存储器划分为多个存储单元,一个存储单元为1Byte = 8 bit

CPU进行数据读写,需要与外部器件进行的信息交互,交互通过总线进行,可在逻辑上分为三类:

地址总线与内存分段

地址总线用于传输存储单元的地址,地址总线能传输多少信息,决定了CPU的寻址能力

一根导线可以传输0或者1两种情况,有n根地址总线,就有 2^n bit 的寻址能力

8086CPU是16位架构,一次能够处理的地址位16位,但8086有20位地址总线,是因为采用了在内部用两个16位地址形成一个20位物理地址的方法:

物理地址 = 段地址 x 16 + 偏移地址

段地址 和 偏移地址 都是16位,而段地址 x 16 后,在16进制中就进位了(末尾加个0),所以可以这样计算物理地址

比如段地址为 1234H,偏移地址为 1234H,段地址向左移一位,相加得到物理地址为13574H

 12340
+ 1234
 ______
 13574

可以使用分段的方式管理内存,将地址连续的内存单元视为一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元

由于段地址x16必然是16的倍数,所以起始地址的结尾必然为0(16进制)

偏移地址最大为FFFFH,即65536个内存单元,所以8086CPU一个段最长为65536 x 1 B = 64KB

寄存器

通用寄存器(AX、BX 、CX、DX)

8086CPU的所有寄存器都是16位的,可以存放2字节

通用寄存器存储一般性数据

为兼容8位,又可以将其分为高位(H)和低位(L),如AX(16位)可以分为AH和AL两个独立8位寄存器使用,其他通用寄存器以此类推

比如AX中数据为1234H,即可以表示4660D/1234H(AX)一个数值,也可以视为12H/18D(AH)和34H/52D(AL)两个数值

8086CPU可一次性处理两种尺寸的数据:

代码段寄存器(CS)、指令指针寄存器(IP)

内存中的数据,既可以当成普通数据,也可以当成指令

8086CPU会将CS:IP指向的内容当作指令执行,CS存储段地址,IP存储偏移地址,

CS:IP指向的物理地址:CS X 16 + IP

几条汇编指令(MOV、ADD、SUB)

指令 用途 高级语言表达
MOV AX, 18 18传入寄存器AX AX = 18
MOV AX, BX BX数据传入AX AX = BX
ADD AX, 8 AX数据加上8 AX = AX + 8
SUB AX, 8 AX数据减去8 AX = AX - 8

若低位寄存器出现溢出,会丢弃左边的数据,不会进位到高位寄存器

Debug使用

指令 用途
r 查看寄存器和要执行的汇编指令编辑寄存器内容
e 编辑073F:0100处的内存。00为新值
d 查看内存
a 向内存写入汇编指令
u 将内存中的数据翻译为汇编指令
t 执行汇编指令

寄存器(内存访问)

DS(段寄存器)和[address]

DS寄存器存放要访问的内存的段地址,[address]为偏移地址

MOV BX, 1000
MOV DS, BX ;不能直接 MOV DS, 1000
MOV AX, [0]
MOV [0], AX

内存中字的存储

一个内存单元为1字节,一个字为2字节,在内存中存储一个字,字的低位字节放在低地址值单元,高位字节放在高地址值单元。如:将1234H送入内存,由于12H位于寄存器中的高8位,所以需要存储在内存的高位(后面),所以1234在内存看起来是“倒着”的

内存地址 数值 寄存器 数值
073F:0000 34 AL 34
073F:0001 12 AH 12

栈机制(PUSH&POP指令,SS&SP寄存器)

栈是一种具有特殊的访问方式的存储空间。

最后进入这个空间的数据,最先出去。

SS存放栈顶段地址,SP存放偏移地址,SS:SP指向栈顶

出入栈的单位都为(16位)

PUSH入栈:执行后,SP=SP-2,将数据送入内存

栈空时,SS:SP指向栈最高地址的下一个单元

POP出栈:执行后,SP=SP+2,数据从内存中送出,但数据依然存在,直到被覆盖

栈顶超界

8086CPU只用SP:PP存储栈顶段地址和偏移地址,并不能限制栈顶上限和栈底,执行push,pop时CPU并不能保证栈不会超界。