星海's Blog

老头初学编程
汇编入门笔记(二)

汇编入门笔记(一)

星海 posted @ 2010年10月27日 06:27 in 汇编学习 , 1492 阅读

Err,为了学习《Linux c一站式编程》要学点汇编

 

 

地址总线的宽度决定了CPU的寻址能力
如:80386地址总线宽度为32根,寻址能力为2^32,4GB (8086 20根,1MB)
数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传达量
如:8086数据总线宽度16根,一次可传输的数据为2B,16bit.
    80386为32根,一次为4B,32bit
控制总线的宽度决定了CPU对系统中其他器件的控制能力
 
8086 cpu中所有寄存器都是16位的,可以存放两个字节。(386为4B)
AX、BX、CX、DX这四个寄存器通常用于存放一般性的数据,被称为通用寄存器。
为保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU以上四个通用寄存器可分为两个可独立使用的8位寄存器来使用xH和xL
 
8086 CPU给出物理地址的方法
如上,8086CPU 20位地址总线,可达到1MB寻址能力
但从CPU内部来看8086又是16位结构,如果将地址从内部简单地发出,那它只能送出16位地址,寻址能力只有64KB。所以它采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
地址加法器采用 物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址.段地址x16有一个更常用的说法是左移4位。进一步思考,一个数据的十六(x)进制形式左移1位,相当于乘以16(x).
 
段地址必然为16的倍数,所以一个段的起始地址也一定是16的倍数。
偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的最大长度为64KB。
如:给定段地址1000H,仅!用偏移地址寻址,CPU的寻址范围为“1000H-1FFFFH”,64KB
CPU可以用不同的段地址和偏移值形成同一个地址。
 
8086CPU有4个段寄存器,CS、DS、SS、ES。CS存放指令的地址,DS存放要访问数据的段地址。
IP为指令指针寄存器。在8080CPU中,这是两个最关键的寄存器。
任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU 将从内存Mx16+N(CS:IP)单元开始,读取一条指令并执行。
其工作流程:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
(2)IP=IP+所读取指令的长度,从而指向下一条指令
(3)执行指令。转到步骤1,重复这个过程。
 
在8086CPU加电启动或复位后,CS和IP被设置为CS=FFFFH,IP=0000H。即在刚启动时,CPU从内存FFFF0H单元中读取指令执行。是开机后执行的第一条指令。
 
mov指令不能用于设置CS IP的值。能够改变CS、IP内容的指令被统称为转移指令。
最简单的 jmp CS:IP
 
栈顶的地址存放在SS寄存器中,偏移地址放在SP中。
 
PUSH时 SP-2 然后再进数据
POP时  先出数据 然后SP+2
 
“segment” ends标记一个段的结束
end标志整个程序的结束
 
CX寄存器中存放的是程序机器码的长度
 
DOS中exe的加载过程:
找到一段起始地址为SA:0的容量足够的空闲内存区域
前256字节,存放一个256字节程序段前缀的数据区PSP
程序的地址被设为 SA+10H:0
将该内存区的段地址存入 DS中( DS=SA)
将CS:IP指向(SA+10H:0)
 
PSP的物理地址为 SAx16
该程序的物理地址为
SAx16+256(psp)=SAx16+16x16=(SA+16)x16
可用段地址和偏移地址表示为 SA+10H:0

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter