一步步学汇编(一)内存存取和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位
换言之用寄存器处理指令所占的位数比较少
- 一步步学汇编(一)内存存取和debug
- 一步步学汇编(六)内存寻址方式
- 一步步学汇编(六)内存寻址方式
- 一步步学汇编(四)[bx]和loop
- 一步步学汇编(二)栈
- 一步步学汇编(七) 数据&总结
- 一步步学汇编(八)转移指令
- 一步步学汇编(九)call & ret
- 一步步学汇编(十)标志寄存器
- 一步步学汇编(十一)内中断
- 170316 汇编-Debug指令、寄存器和内存
- 一步步学汇编(三)开始编写程序
- 一步步学汇编(五)利用多个段编写程序
- 一步步 学数据结构 之 一
- 查看CPU和内存以及debug的使用——汇编学习笔记(二)
- Linux shell 基础(一),自己慢慢一步步学
- 一步步教你学Weex实现登录功能(一)
- 跟我学汇编(一)基础知识
- 添加收藏,将网页添加到浏览器收藏夹里
- mysql主从error1236解决
- oracle表分区详解
- LaTeX学习心得之 —— 中文 书签无乱码 及 pdf书签链接 以及正确的tableofcontents(转)
- PHP中$_SERVER的详细参数与说明
- 一步步学汇编(一)内存存取和debug
- 20110327-8.1.2-IO对象不可复制或赋值
- 20110327-8.2-流必须处于无错误状态才能用于输入输出
- 项目开发日志(1) 20110327
- 20110327-8.3-将输入与输出绑在一起
- 内存映射文件
- 吕述望 密码一样的人生
- 20110327-8.3-warning-如果程序崩溃了,则不会刷新缓冲区,最好的方法是保证所有的输出操作都显式地调用了flush或endl
- 体系结构