《汇编语言第三版》豆瓣链接
根据目前读的情况来看,这本书设计的还是面向初学的,又没有翻译书的那些语句毛病,循序渐进,图文并茂,好书!!!
第一章:基础知识
计算机的核心是cpu,cpu通过总线(地址总线、数据总线、控制总线)与各内存设备(RAM、ROM)连接。
cpu只能识别二进制,通过总线将数据或者指令在内存中的读写,再由各内存将指令映射(output/input)到各种设备。cpu对显示器、磁盘等的控制是间接的。
汇编指令对人类友好,通过编译器转化为对应的机器指令。高级语言的编译器是对上述过程的再次抽象。
内存都有一个地址编号,cpu通过地址总线同内存建立联系,受限于地址总线的数量,cpu的寻址空间是有限的。
第二章:寄存器
8086的寄存器是16位的,通用寄存器有:AX, BX, CX, DX,
8086有20位地址总线,但是寄存器只有16位,导致有特殊的寻址方式:物理地址=段地址*16+偏移地址。其中寄存器CS:IP表示指令的物理地址。
介绍了几个简单的汇编指令:add、mov、jmp
第三章:寄存器(内存访问)
一个字包含二个字节,16字==16位
寄存器DS表示内存数据的段地址,mov ax,[0]是指将内存地址为DS:0中的数据赋给ax
8086不可以用mov指令给所有的段地址赋值,需要使用通用寄存器中转
栈的概念。使用SS:SP表示起始地址为SS容量为SP的栈,cpu不会对栈超界做限制,使用栈要自己管理栈顶,栈容量的范围为0~FFFF
push、pop可以在栈与指定位置传递数据,遵循先入后出原则
第四章:第一个程序
win系统可用masm将汇编源文件生成可执行文件:1,masm+源文件名-> obj文件;2,link+obj文件->exe文件。其中每步都还有各自的中间流程
debug+可执行文件可查看文件的执行过程
可执行文件加载到内存SA:0时前256个字节为PSP(不知道干什么的)的预留字段,段寄存器CS为SA+10
第五章:[bx]和loop指令
汇编源文件: mov ax,[0] == mov ax,0
debug: mov ax,[0] == mov ax,ds:[0]
汇编源文件区分进制,debug默认全部为16进制
新的命令:loop,inc
第六章:包含多个段的程序
新指令:start,dw
可以在一个段中包含数据和程序,程序入口用start指明,程序结束是end start
可以在多个段中分别定义数据,栈,程序,关联多个段寄存器,初始化时注意!
第七章:更灵活的定位内存地址的方法
新指令:and、or
[bx+di+idata]多项和表示偏移地址。[bx+idata]的方式为C语言的数组表示提供了基础。
大小写字母的ascii码相差0x20,也就是二进制的第五位不同,'A' & 0b1101111' == 'a'
循环嵌套由于循环寄存器只有一个cx,需要将cx在内存中的读写,多用栈来做缓存。
如果一个问题的解决方案,使我们陷入一种矛盾之中。那么,很可能是我们考虑问题的出发点有了问题,或就是,我们起初运用的规律呢并不合适。
第八章 数据处理的两个基本问题
新指令:div、dd、dup
只有bx、si、di、bp四个寄存器可以指示偏移地址。其中bp默认模式是ss:[bp]
寻址的多样化写法能够帮助理解数组、结构体,但是他妈的确实麻烦,更麻烦的是div的要求
处理数据要解决的是数据在哪?有多长?帮助理解静态语言的强制类型和c指针。
数据的处理包括读取、写入和运算。
第九章:转移指令的原理
完成了实验九,在win7的debug下只能看到一部分效果,但是能想明白很多东西的
新指令:offset、jcxz
jmp的一些用例
jcxz实现break、continue
loop实现do...while
新开公众号“码家村”,欢迎关注