用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

feng    -  云代码空间

——

汇编基础-寄存器

2012-12-16|1804阅||

摘要:在cpu中      运算器进行信息的处理 寄存器进行信息的存储 控制器控制各种器件进行工作 内部总线连接各种器件,在他们之间进行数据的传送 对于汇编程序员来说,cpu中的主要部件是寄存器,寄存器是cpu中程序员可以用指令读写的部件,程序员通过改变各

在cpu中  

   运算器进行信息的处理

寄存器进行信息的存储

控制器控制各种器件进行工作

内部总线连接各种器件,在他们之间进行数据的传送

对于汇编程序员来说,cpu中的主要部件是寄存器,寄存器是cpu中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对cpu的控制

8086cpu有14个寄存器,每个寄存器都有一个名称。这些寄存器是:ax,bx,cx,dx,si,di,sp,bp,ip,cs,ss,ds,es,psw.

通用寄存器

8086cpu所有寄存器都是16位的,可以存放两个字节,ax bx cx dx 这4个寄存器通常用来存放一般性的数据,称为通用寄存器

那么一个16为寄存器可以存储的数据的最大值是多少呢?65535

由于8086上一代的寄存器都是8位的,为了保证兼容性,8086cpu的ax bx cx dx这4个寄存器都可以分为两个独立使用的8为寄存器来使用

ax   分为 ah(高八位) al(低八位)

bx   分为 bh bl

。。。。。。。

一个8位寄存器所能存储的最大数据位?255

字在存储器中的存储

处于对兼容性的考虑 8086cpu可以一次性处理以下两种尺寸的数据

字节(8位) 和 字(16位)

十六进制数的一位相当于二进制数的4位 ,如0100111000100000 可表示成4(0100)   E(1110) 2(0010) 0(0000)四个十六位进制数

几条汇编指令

mov ax,18 将18送入寄存器ax       ax=18

mov ah,78 将78送入寄存器ah      ah=78  

add ax,8    将寄存器ax中的数值加上8 ax=ax+8

mov ax,bx ..........................

add ax,bx ...........................

如题(H 表示是16进制数)

one:

ax=8226H   bx=8226H

add ax ,bx

ax=?          bx=?

分析:

16进制加法 逢16进一

ax=ax+bx=8226+8226=1044CH 由于ax为16位寄存器,只能存4位十六进制数据,因此最高位1不能保存在ax中,ax=044CH;bx=8226H;

two:

ax=00c5H

add al,93H

ax=?

分析

al 中的数据=C5   al=C5+93=158H   由于al为8位寄存器,只能存放两位16进制的数据,最高位的1丢失

ax中的数据为:0058H(这里的丢失不是真的丢弃这个进位值,后续解释)

注意:此时的al是作为一个独立的8位寄存器来使用,和ah没有任何关系。在进行数据传送或运算时,要注意指令的两个操作对象的位数应当一致的。

例如:

mov ax ,bl (错误的,在8位和十六位寄存器之间传送数据)

用目前学过的汇编指令,最多4条指令,编程计算2的4次方?

mov ax,2   //ax=2

add ax,ax //ax=2+2

add ax,ax //ax=4+4

add ax,ax //ax=8+8

物理地址

我们知道,cpu访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个空间有唯一的地址,我们称这个唯一的地址叫物理地址!

cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址。在cpu向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。如何形成内存单元的物理地址呢?

16位结构的cpu

什么是16位结构的cpu呢?

概括的讲,16位结构表现为

    运算器一次可以最多处理16位的数据

   寄存器的最大宽度为16位

   寄存器和运算器之间的通路为16位

8086是十六位结构的cpu,也就是说在8086内部,能够一次性处理,传输,暂时存储的信息的最大长度是16位的。

8086cpu有20位地址总线,可以传送20位地址。达到1mb寻址能力。8086cpu又是16结构的,因此8086cpu采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

cpu要读写内存时

1 cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

2 段地址和偏移地址通过内部总线送入一个叫地址加法器的部件

3 合成20位地址

4 将20位地址送入输入输出控制电路;

5 再送入地址总线

6 在送入存储器

地址加法器采用 物理地址=段地址*16+偏移地址 (一个X进制的数据左移一位,相当于乘以X)

内存单元地址小结

cpu可以用不同的段地址和偏移地址形成一个物理地址

偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可以巡64kb个内存单元

比如给定段地址 1000H,用偏移地址寻址,cpu寻址范围为:10000H~1FFFFH

数据在21f60H内存单元中的讲法为 数据存在内存2000:1f60单元中

题:

1 给定段地址为0001H,仅通过变化偏移地址寻址,cpu寻址范围为?到?

分析:偏移地址16位,变化范围为0~FFFFH 所以 answer:00010H到1000FH

2 有一个数据存放在20000H单元中,现给定段地址为sa,若想用偏移地址寻址到此单元,则sa得满足最大?最小?

分析: 单偏移地址为0时,sa最大 为2000H ,单偏移地址最大,sa最小 为FFFF+sa*16=20000 sa=1001H answer :sa最大 为2000H       sa最小为sa=1001H

段寄存器

是什么部件提供段地址?8086有4个段寄存器:cs ds ss es;由这四个提供!这里看cs

cs和ip

cs和ip是8086中最关键的两个寄存器,他们指示了cpu单前要读取指令的地址!!!!cs为代码段寄存器,ip为指令指针寄存器

在8086中,任意时刻 如果cs内容为M ip内容为n 则cpu将从内存m*16+n中读取指令并执行

现在,如果提出一个问题:cpu根据什么将内存中的信息看作指令?cpu将cs:ip指向的内存单元中的内容看做指令,任何时候,cpu将cs ip中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令!

8086cpu工作过程:

1 从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲器

2 ip指向下一条指令

3 执行指令。(转到1 重复这个过程)


查看cpu和内存!用机器指令和汇编指令编程

预备知识:debug的使用

r命令查看,改变cpu寄存器的内容(r   ||    r cs 回车 改变的值 )

d命令查看内存中的内容(d || d 1000:0 查看内存10000H处的内容 之后接着按d可查看后续内容 | |  

                                        d 1000:0 9 查看1000:0到1000:9的内存内容)

e改写内存中的内容 (e 1000:0 从内存地址10000H处开始改写内存内容 回车结束改写)

u将内存中的机器指令翻译成汇编指令 (u 1000:0 查看该处的汇编指令)

t 执行一条机器指令 (可先用r来改写csip   在用t来一步一步执行指令)

a 以汇编指令的格式写机器指令(a 以汇编的形式写入指令,e是以机器指令写)

pc机主板上的rom中写有一个生产日期,在内存fff00H~fffffH的某处,请找到并试图修改它!!

分析:打开debug 输入 d fff0:0 发现没有 在输入d fff0:0080 还是没有 在输入d fff0:00e0 此时我们发现出现了日期的身影 04/27/05 所处的位置在 fff0:00f5 到fff0:00fc     此时我们用e fff0:00f5开始改写 完后再用d来查看 发现并没有改变。因此我们认为此处是只读的!!

顶 9踩 6收藏
文章评论
    发表评论

    个人资料

    • 昵称: feng
    • 等级: 资深程序员
    • 积分: 1584
    • 代码: 8 个
    • 文章: 42 篇
    • 随想: 2 条
    • 访问: 84 次
    • 关注

    站长推荐