一步步学汇编(一)内存存取和debug

来源:互联网 发布:淘宝网波西米亚连衣裙 编辑:程序博客网 时间:2024/05/17 22:39

实践我第一天的承诺,今天看了点汇编,做了点笔记,觉得有意思的,重要的就记下来了。

还是从基础的8086开始。虽然现在计组合嵌入式学校里教的都是arm和mips的,但是还是觉得8086最经典,下面是我今天的笔记:

 

 

关于8086cpu的物理地址给出:
CPU通过地址总线送入存储期的必须是一个内存单元的物理地址,在cpu向
地址总线上发送物理地址之前,必须在内部先形成这个物理地址。
机器的寻址能力到底由什么决定呢?
这有点类似于木桶原理,总是由最下面的那块木板决定存水量,比如8086
CPU有20位地址总线,可以传送20位地址,已经达到了1MB的寻址能力。但
是其CPU内部又是16位结构,在内部一次性处理、传输。暂时存储的地址,
是16位,所以其表现出来的寻址能力还是16位(64kb)

继续针对8086CPU,我认为下面这个概念应该要弄明白,这对于汇编语言的
学习十分重要,就是内存的读写方法:

(1)CPU中的相关部件提供16位的地址,一个为段地址,另一个为偏移地址;
(2)通过地址加法器将两个16位地址合成一个20位的物理地址;
(3)物理地址的合成方法:物理地址=段地址*16+偏移地址,更进一步来说
,8086CPU的寻址功能是:基础地址+偏移地址=物理地址(在这里段地址*16
看成是基础地址)

CPU的通用寄存器:AX,BX,CX,DX
CPU的段寄存器:CS,DS,SS,ES(8086CPU用这四个寄存器提供内存单元的
段地址)
CS为代码段寄存器,IP位指令指针寄存器(说白了CS存代码段地址,IP存偏
移地址,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元
开始读取)

程指令的执行过程:先由CS:IP传入地址加法器,获得程序段的地址,然后将
程序段的地址告知地址总线,再有数据总线从内存该地址开始读取指令,然后
由I/O控制电路将指令送入指令缓冲区,最后送入执行控制器执行)

每读取一条指令IP的值会自动增加(根据指令所占的位不同而加相应的值),
所以可以连续地读。

在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,即FFFF0H单元中
的指令是8086PC机开机后执行的第一条指令。(不知道现在的CPU是什么状态了
?)

指令和数据在内存中的存储形式都是二进制,所以怎么区分哪些是指令呢?
A: 就是靠CS和IP,即CS:IP所指的地址就是指令的地址。

*MOV 不能用来修改IP和CS的值,要修改它们的值必须用转移指令(jmp之类)

例:
jmp 2AE2:3 执行后:CS=2AE3H,IP=0003H

如果只想修改IP的内容,则可用指令“jmp 某一合法寄存器”实现
例:
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
        指令执行后:ax=1000H,CS=2000H,IP=1000H


debug的功能
(1)r命令查看、改变CPU寄存器的内容;
(2)d命令查看内存中的内容;
(3)e改写内存中的内容;
(4)u将内存中的机器指令翻译成汇编指令;
(5)t执行一条机器指令;
(6)a以汇编指令的格式在内存中写入一条机器指令
上述位最常用的6个功能

好吧~~debug 真的很好玩,尤其是玩内存(一个小方法看主板的生产日期)

发现一个小东西:
mov ax,6 需要3位
mov ax,bx只需要2位
换言之用寄存器处理指令所占的位数比较少