近期,读了王爽的《汇编语言》1-8章,收获很多;对CPU,编程有了新的理解。
CPU是世界上最聪明的,同时也是最笨的“大脑”。汇编程序员只需要通过改写寄存器,就可以随意控制CPU让它干各种复杂的运算;高级语言编写的应用程序,无论有多么的复杂,最终还是回归到操控寄存器。掌握了寄存器的使用,CPU就是你的傀儡。
作为一个应用程序码农,理解了寄存器,对程序内存分配(段的划分来自于寄存器)也会有新的认识。
1. 重要概念
地址总线的宽度决定了CPU的寻址能力。
数据总线的宽度决定了CPU与其它器件进行数据传输时的一次数据传输量。
控制总线的宽度决定了CPU对系统中其它器件的控制能力。(比如读写信号)
对CPU来说,系统中所有存储器中的存储单元都处于一个统一的逻辑存储器中;这个逻辑存储器即是我们所说的内存地址空间。(统一编址)
段地址*16+偏移地址=物理地址
一段内存,可以即是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于CPU中寄存器的设置,即CS、 IP,SS、SP,DS的指向。
2.编译调试(第二章实验1)
运行masm 编译出obj文件,运行link编译出exe文件。
运行debug调试exe文件;
Debug必用命令:
R查看、改变CPU寄存器的内容
R AX改变寄存器中AX的内容
T 单步执行
U将内存中的机器指令翻译成汇编指令
U DS:0000 查看数据段地址与内容,偏移地址为0000
D查看内存中的内容
D DS:0查看DS中的内容
E改写内存中的内容
A以汇编指令的格式在内存中写入一条机器指令
3.寄存器
AX(ah,al):(accumulator)累加器;在乘、除等指令中指定用来存放操作数。
BX(bh,bl):(base)基址;在计算机存储地址时,它经常用作基址寄存器[bx]。
CX(ch,cl):(count)计数。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器。
DX(dh,dl):(data)数据。一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位数。
CS 代码段寄存器
IP 指令指针寄存器;CS:IP下一条即将执行的指令
DS代码段寄存器
SI 源变址寄存器; DS:[SI],在段地址为DS中偏移地址为SI的地址
DI目的变址寄存器
(SI和DI是8086CPU中和BX功能相近的寄存器,用于段的偏移地址,区别是SI和DI不能够拆分为 2 个独立的 8 位寄存器)。
SS栈段寄存器
BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶;SS:SP栈顶。
ES附加段寄存器(可以当做对CS/DS/SS的扩展,当上述段不够用时,可以用ES)
4寻址方式
直接寻址
寄存器间接寻址
寄存器相对寻址
基址变址寻址
相对基址变址寻址
(8.4章讲的很清楚,就不写了)
5.指令
不做介绍,资料遍地是
引用书中的一句话:
学习汇编,可以自由、直接地用汇编语言去操作真实的硬件,了解那些早已被层层系统软件掩盖的真相。