第一章
进制转换:十六进制的一位对应四位二进制,八进制一位对应3位2进制,十进制转二进制就除以2再将余数倒过来排列就行,其他也是一样。
补码:负数将原本正数的补码所有位置取反并且在末尾加一,正数是它本身。
反码:正数一样是自己,负数的话就是补码减一。
注意:例如八位二进制,其原码表示范围是-127~ +127, 但其补码表示范围为-128~+127,这是因为补码中没有+0和-0之区分,原本10000000为-0,我们将1000 0000规定为-128,这样就可以让有符号数多一个有用的数据点。这个值不能用普通的取反加1来计算。
补码的加减法:
[X]补 求补→[-X]补 求补→ [X]补,即一个数字求补两次后会回到其本身
加法:[x+y]补=[x]补+[y]补
减法:[x-y]补=[x]补+[-y]补
第二章
1,8086寄存器组:
通用寄存器:ax,bx,cx,dx,bp,si,di等
ax:当累加器用,而且在乘除运算中都作为默认的寄存器。
bx:可用来做基址寄存器。
cx:一般用来做计数器,比如在loop循环中为循环的次数
DX:有时候会与AX一起使用,用来保存乘积高位或者除法的余数,而且DX还可以用来保存I/O的端口地址。
以上的寄存器都为16位寄存器,并且它们可以拆分位两个八位寄存器来分开使用,例如ax可以拆分位ah(高位)和al (低位)。
sp:又称作堆栈指针寄存器,一般用来表示栈顶的偏移地址。
bp:又称作基址寄存器,用来寻址时使用,且其默认的段为ss而并非ds。
si:源变址寄存器,寻址时默认段为ds
di:目的变址寄存器,寻址时默认段为ds。
以上的四个寄存器也为16位寄存器,但是它们不能拆为两个八位寄存器来使用。
专用寄存器:
ip,cs,flags等
ip:用来存放当前指令的偏移量
cs:用来存放当前指令的段地址。
flasgs:标志寄存器,或者叫做psw,用来存放条件码标志,例如溢出,进位等。
段寄存器:如cs(代码段),ds(数据段),ss(堆栈段),es(附加段)。
存储器:
在计算机中,以字节为单位进行存储数据和编码,而每一个字节单元有一个唯一的物理地址,地址从0开始编号,以此类推。
故十六位二进制数可以表示2的十六次方个字节单元地址,即64K.
存储方式:我们知道,在机器中很多数据是16位,而单元地址是8位,则需要两个单元地址来保存一个十六位数据,故在计算机中以高位高地址,低位低地址来保存,即1234H(H表示十六进制),12H保存在低位,34H保存在高位。而一个十六位的地址,我们以其高位的地址来代表这整个数的地址。
实模式存储器寻址:
我们知道,8086的地址总线宽度为20位,而实模式下最大寻地址空间为1MB,那么如何在16位的机器中表达20位的地址呢,这就要对20位地址进行分段表示,即切割成不同的块,而在8086中,将1MB分割成了64块,那么每一块就是64K,从而20位物理地址由16位段地址和16位偏移地址表示,在计算物理地址时只用将段地址✖16(左移4位)再加上偏移地址就是20位的物理地址了。
段寄存器:
故ds(数据段),es(附加段)等段也是这个意思,每个段可以独立地占用个64kb存储区,而各段也可以重叠,例如代码段只需要8kb,数据段只用2kb,堆栈段只用256b,则可以进行动态分区节约空间,代码段从0~8kb为其地址后,其8kb+1就直接是数据段的地址即可,而这些是由操作系统来完成的。而如果超过64kb,则需要动态地修改段寄存器的内容。