前言
汇编学习这个系列是我一直想要开启的一个学习模块,但是因为种种原因一直没有开始做这件事,正好我们开始准备做操作系统,我们必须出发了,之前的一些事情只能让它飞向天边了。
基础概念
指令和数据,在内存和硬盘上,指令和数据没有什么区别,即使是汇编指令也是以二进制的存在于内存之中的。
cpu 对存储器的读写必须有以下的几点信息:
@存储单元的地址信息
@器件的选择,读或者写的指令
@读或写的数据
总线:
地址总线:地址总线就是传输地址的位。
数据总线:数据总线传输的位决定了每次能够传送数据的量,结合频率可以算出传输数据的量。
控制总线:控制线的总数决定了控制的能力。
寄存器
对于我们如果想用汇编写程序,CPU的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件,其中包括:
AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
寄存器介绍(8086PC,16位):
所有寄存器都是16位的,可以存放两个字节,4个普通寄存器。
AX,BX,CX,DX : 这4个寄存器可以分开使用的,每次使用8位的使用。
AH AL BH BL CH CL DH DL
字在寄存器中的存储:
字节: byte 一个字节由8个bit 组成,存在8位寄存器中。
字:word 一个字由两个字节组成,着两个字节分别称为这个字的高位字节,低位字节。
8086寻址方式:
物理地址 = 段地址 《 4 + 偏移地址
段地址必然是16 的倍数,一个段的起始地址也一定是16 的倍数,偏移地址为16位,16位的寻址空间就是64KB。
4个段寄存器:CS,DS,SS,ES
CS:代码段寄存器 IP:指令指针寄存器
寻址通式:CS:M IP:N
M*16 + N
修改CS,IP的指令
jmp 指令修该CS:IP地址,如果只修改IP 则使用 “jmp + 寄存器”的方式。
8086编码开始(在8086实模式下,我们使用debug 命令调试)
R : 查看改变CPU寄存器的内容
D : 查看内存中的内容
E:改写内存中的内容
U:将内存中的机器指令翻译成汇编指令
T:执行一条机器指令
A:以汇编指令的格式在内存中写入一条机器指令
DS寄存器:存放需要访问数据的段地址。当使用[num] 来读取数据的时候,8086会自动取DS寄存器中的数据。位内存单元的段地址。8086 不支持将数据直接送入段寄存器的操作。
SS,SP 寄存器(栈寄存器):8086CPU中,有两个寄存器,这两个寄存器正好是用来刻画栈的。
任意时刻,SS:SP指向栈顶元素。push 指令和pop 指令 执行时,从SS:SP中得到栈的地址。push ,pop 其实也是一种内存传送指令,可以在寄存器和内存之间传输数据。与mov 指令不同的是push pop 访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。注意:与mov 不同的是,push 是两步操作。修改栈段寄存器SS的指令会被一起执行。
loop 指令:
cx: 循环次数
mov cx,循环次数
s:
{
/*循环体*/
}
loop s
查看原文:http://zmrlinux.com/2016/05/16/%e6%b1%87%e7%bc%96%e5%ad%a6%e4%b9%a0%ef%bc%88%e4%b8%80%ef%bc%898086%e6%b1%87%e7%bc%96%e6%8b%be%e9%81%971/
还没有评论,来说两句吧...