当前位置: 首页 > 汇编 > 正文

汇编学习(一)8086汇编拾遗(1)

前言

汇编学习这个系列是我一直想要开启的一个学习模块,但是因为种种原因一直没有开始做这件事,正好我们开始准备做操作系统,我们必须出发了,之前的一些事情只能让它飞向天边了。

基础概念

指令和数据,在内存和硬盘上,指令和数据没有什么区别,即使是汇编指令也是以二进制的存在于内存之中的。

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/ | Kernel & Me

该日志由 root 于2016年05月16日发表在 汇编 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 汇编学习(一)8086汇编拾遗(1) | Kernel & Me