《汇编语言》笔记

Chapter 1
指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别。

地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。

数据总线的宽度决定了CPU和外界的数据传送速度。

有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。

80368CPU的地址宽度为32,则内存地址空间最大为4GB。
laciqs按:现在常见的CPU虚拟内存地址空间为4GB,地址宽度为32位,故:
char *p;
printf("%lu\n", (unsigned long)sizeof(p));
结果为4。

系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

Chapter 2
很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的,比如20000写成4E20就可以直观地看出,这个数据是由4E和20两个8位数据构成的。

al是作为一个独立的8位寄存器来使用的,和ah没有关系。CPU在执行这条指令时认为ah和al是两个不相关的寄存器。不要错误地认为,诸如add al, 93h的指令产生的进位会存储在ah中。

在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。

计算2^4:
mov ax, 2 '2^1
add ax, ax '2^2
add ax, ax '2^3
add ax, ax '2^4
使用add指令

一个X进制的数据左移1位,相当于乘以X。

CS、DS、SS、ES提供内存单元地址。

CS为代码段寄存器,IP为指令指针寄存器。

CS存放指令的段地址,IP存放指令的偏移地址。

IP是在读取一一条指令后改变的。

任意时刻,CPU将CS:IP指向的内容当作指令执行。

读取一条指令后,IP中的值自动增加。

mov指令不能用于设置CS、IP的值,转移指令可以:
jmp CS:IP
e.g:
jmp 2AE3:3

jmp ax仅改IP。
好似mov IP, ax

r
r 寄存器

d
d CS:IP
d CS:IP 偏移地址

e 起始地址(偏移地址) 数据 数据 数据……
e 1000:10

下面内容摘自于网上

还有另一种情况,如果你发现你能修改ROM中的生产日期,那么原因如下:

每个计算机的结构都不一样,教材考虑的是普通8086PC机上的效果,个别计算机的效果可能不同。

也就是说 在你的计算机中 这个内存是可修改的 

所以,认为所有的计算机某些地址的内存不能修改是片面的。

 

书上说rom是只读的你就不去验证了吗?如何验证呢? 

我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神,怀疑之后再去验证才能跟深刻的理解知识,提升自己的能力,甚至还会发现有些书上描述的不准确甚至错误的地方。 

 

--引用这几本书综合研究的三个问题: 

都再用,我们就非得用吗? 

规定了,我们就只知道遵守吗? 

司空见惯,我们就不怀疑了吗? 

 

尽信书不如无书大概也有这个道理吧^_^


Chapter 3
低位字节存放在低地址单元中,高位字节存放在高低纸单元中。(低放低,高放高,此曰小端字节序,相反曰大端字节序)

ds寄存器通常用来存放要访问数据的段地址。
8086CPU由于硬件设计问题,不支持将数据直接送入(包括mov,add,sub等)段寄存器的操作。只好用一个寄存器来进行中转,如ds。
Example:
mov bx, 1000H
mov ds, bx
mov al, [0]

mov al,  [0] '传字节
mov ax, [0] '传字

累加数据段中前3个字型数据:
add ax, [0]
add ax, [2]
一个字型数据占两个单元,所以偏移地址是0、2、4

执行一条指令后,ip=ip+此指令长度

栈:LIFO(Last In First Out, 后进先出)

8086CPU的入栈和出栈操作都是以字为单位进行的。

8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

入栈时,栈顶从高地址向低地址方向增长。

Chapter 4

Chapter 5
通常用cx存放循环次数。

在汇编源程序中,数据不能以字母开头。

g命令可以指定执行到何处:
g 0012

用p命令Debug可以自动重复执行循环中的指令,直到(cx)=0为止。
当然,也可以直接用g命令。

用一个16位寄存器来做中介,将内存单元中的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。
按:All problem in computer science can be solved by another level of indirection

源程序中,mov al, [0]与mov al, 0等同。
应用mov al, ds:[0],“ds:”称作段前缀。

可以使用两个段寄存器分别存放源始单元ffff:X和目标单元0020:X的段地址。

cx在载入程序后保存程序的长度。 

mov用在寄存器之间传送数据的指令是2个字节,用在寄存器和立即数之间是3个字节。

dw即“define word”。

Chapter 6

Chapter 7
如果一个问题的解决方案,使我们陷入一种矛盾之中。那么,很可能是我们考虑问题的出发点有了问题,或是说,我们起初运用的规律并不合适。

无需判断转换大小写:
大写字母ASCII码的第5位为0,小写字母的为1。
C语言描述:
a = a & 0xDF;
b = b & 0xDF;

mov ax, [200+bx]
mov ax, 200[bx]
mov ax, [bx].200
以上三个指令效果相同。
同理,
mov ax, [bx+si]
mov ax, [bx][si]
相同。

si和di是8086CPU中和bx功能相近的寄存器,但不可拆成两个8位寄存器。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值