代码分析
1.在汇编代码中,发现有很多[],[]表示是间接寻址,bx和[bx]的区别是,前者操作数就是bx中存放的数,后者操作数是以bx中存放的数为地址的单元中的数。
比如:mov ax,[bx]
bx中存放的数是40F6H,40F6H、40F7H两个单元中存放的数是22H、23H,则
mov ax,[bx];2322H传送到ax中
mov ax,bx;40F6H传送到ax中
2.movzx指令一般用于将较小值拷贝到较大值中,其实就是将我们的源操作数取出来,然后置于目的操作数,目的操作数其余位用0填充。
比如eax=00304000h
若执行 movzx eax, ax后 eax = 00004000h.
若执行 movzx eax, ah后 eax = 00000040h.
3.SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
ROL DEST,COUNT
把目的地址中的数据循环左移COUNT次,每次从最高位(最左)移出的数据位都补充到最低位(最右),最后从最高位(最左)移出的数据位保存到CF标志位。
4.寄存器
8086处理器中的寄存器分为8组,每组宽度为32位
通用寄存器、段寄存器、指令寄存器、标志寄存器、系统地址寄存器、控制寄存器、调试寄存器、测试寄存器
通用寄存器:
EAX 累加器 在乘法和除法指令中被自动使用
EBX 基址寄存器
ECX 计数器 循环计数器
EDX 数据寄存器
ESI 源变址寄存器
EDI 目的变址寄存器
EBP 扩展基址指针寄存器 由高级语言用来引用函数参数和局部变量
ESP 栈指针寄存器
EAX EBX ECX EDX ESI EDI EBP ESP #32位
AX BX CX DX SI DI BP SP #低16位
AH BH CH DH #高8位
AL BL CL DL #低8位
段寄存器:
CS:代码段(Code Segment)
DS:数据段(Data Segment)
ES:附加数据段(Extra Segment)
SS:堆栈段(Stack Segment)
FS:附加段
GS 附加段
指令寄存器:
EIP 指令指针寄存器,低16位为IP(8086),它存储的是下一条要执行指令的地址。
标志寄存器:
IOPL(I/O Privilege Level) I/O特权级字段,它的宽度为2bit,它指定了I/O指令的特权级。如果当前的特权级别在数值上小于或等于IOPL,那么I/O指令可执行。否则,将发生一个保护性异常。
NT(Nested Task): 控制中断返回指令IRET,它宽度为1位。NT=0,用堆栈中保存的值恢复EFLAGS,CS和EIP从而实现中断返回;NT=1,则通过任务切换实现中断返回。
RF(Restart Flag): 重启标志,它的宽度是1位。它主要控制是否接受调试故障。RF=0接受,RF=1忽略。如果你的程序每一条指令都被成功执行,那么RF会被清0。而当接受到一个非调试故障时,处理器置RF=1。
VM(Virtual Machine): 虚拟8086模式(用软件来模拟8086的模式,所以也称虚拟机)。VM=0,处理器工作在一般的保护模式下;VM=1,工作在V8086模式下。
其它16个标志位的含义和8086一样:
CF(Carry Flag): 进位标志位,由CLC,STC两标志位来控制,在无符号算数运算的结果无法容纳于目的操作数中时被设置
PF(Parity Flag): 奇偶标志位
AF(Assistant Flag): 辅助进位标志位
ZF(Zero Flag): 零标志位
SF(Singal Flag): 符号标志位
IF(Interrupt Flag): 中断允许标志位,由CLI,STI两条指令来控制
DF(Direction Flag): 向量标志位,由CLD,STD两条指令来控制
OF(Overflow Flag): 溢出标志位
PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成
OF(Overflow Flag)溢出标志。溢出时为1,否则置0
SF(Sign Flag)符号标志。结果为负时置1,否则置0
ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0
CF(Carry Flag)进位标志,进位时置1,否则置0
AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0
PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0
DF(Direction Flag)方向标志,在串处理指令中控制信息的方向
IF(Interrupt Flag)中断标志
TF(Trap Flag)陷井标志
深入理解计算机系统
今天读了《深入理解计算机系统》第1章部分,通过一个hello程序执行过程来进行对计算机系统的学习。
hello程序的生命周期
源程序hello.c->(预处理器)->修改的源程序hello.i->(编译器)->汇编程序hello.s->(汇编器)->可重定位目标程序hello.o+printf.o->(链接器)->可执行目标程序hello
printf函数存放于printf.o中,它是每个C编译器都会提供的标准库中的一个函数。
通过这样一个简单的程序来了解编译系统是如何工作的,理解编译系统是大有益处的,它可以帮助我们优化程序性能、理解链接时出现的错误、避免安全漏洞。
计算机系统的硬件组成
总线:携带信息字节并负责在各个部件间传递。
I/O设备:系统与外部世界连接的通道,比如鼠标、键盘、磁盘都属于输入输出设备。
主存:在处理器执行程序时,用来存放程序和程序处理的数据。
处理器:解释执行存储在主存中指令的引擎。
随着近些年半导体技术的发展,加快处理器的运行速度比加快主存的运行速度要容易和便宜的多,处理器和主存之间的差距不断增大,为了减少这种差异所带来的影响,加入了一种高速缓存机制。高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多,接近于CPU的速度。由局部性原理可以知道,在CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。通过让高速缓存里存放可能经常访问的数据的方法,可以大幅度提高提升程序执行的速度。