汇编语言笔记

处理器拥有对整个系统所有总线的控制权,处理器中有一些寄存器,这些寄存器可以保存特定长度的数据。

寄存器:处理器中可以保存数据的地方。寄存器可以被装入数据,也可以在不同的寄存器之前移动这些数据。基本上,像四则运算、位运算等这些计算机操作,都主要是针对寄存器进行的。

 

EXA是一个32位的寄存器,同时它的低16位又可以通过AX这个名字来访问;AX又被分为高、低8bit两部分,分别由AH和AL来表示。

 

EAX 32-bit宽 通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)

EBX 32-bit宽 通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。

ECX 32-bit宽 通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。

EDX 32-bit宽 通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)

注意:上述寄存器同EAX一样包括对应的16-bit8-bit分组

                                                                                                                                                                

用作内存指针的特殊寄存器:

ESI 32-bit宽  通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。

EDI 32-bit宽 通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。

EBP 32-bit宽 这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。

注意:这三个寄存器没有对应的8-bit分组。换言之,你可以通过SIDIBP作为别名访问他们的低16位,却没有办法直接访问他们的低8

 

特殊寄存器(指向到特定段或内存的偏移量)

EIP 这个寄存器非常的重要。这是一个32位宽的寄存器 ,同CS一同指向即将执行的那条指令的地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器)

ESP 这个32位寄存器指向堆栈中即将被操作的那个地址。尽管可以修改它的值,然而并不提倡这样做,因为如果你不是非常明白自己在做什么,那么你可能造成堆栈的破坏。对于绝大多数情况而言,这对程序是致命的。(SS是默认的段或选择器)

IP: Instruction Pointer, 指令指针 SP:Stack Pointer, 堆栈指针

                                                                                                                                                  

 

如:代码mov eax,012345678h 会将012345678h送入eax ; mov指令(move)可以将数据送入寄存器。

如:代码xchg ebx,ecx,则ebx与ecx的数值将被交换

如:代码add eax, edx,将eax+edx的值存入eax。减法指令和加法类似,只是将add换成sub。

 

需要说明的是,与高级语言不同,汇编语言中,如果要计算两数之和(差、积、商,或一般地说,运算结果),那么必然有一个寄存器被用来保存结果。

 

处理器在执行指令时,需要经过几个不同的阶段:取指、译码、取数、执行。

 

C语言是汇编语言的抽象,在汇编语言中,几乎所有对内存的操作都是对给定地址的内存进行访问来完成的。

 

保护模式的主要目的在于允许多个进程同时运行,并保护它们的内存不受其他进程的侵犯。这有点类似于C++中的机制,然而它的强制力要大得多。如果你的进程在保护模式下以不恰当的方式访问了内存(例如,写了“只读”内存,或读了不可读的内存,等等),那么CPU就会产生一个异常。这个异常将交给操作系统处理,而这种处理,假如你的程序没有特别说明操作系统该如何处理的话,一般就是杀掉做错了事情的进程

 

寄存器可以用作内存指针。可以将内存想象成一个顺序的字节流,使用指针可以任意地操作(读写)内存。

 

两个显式地操作堆栈的指:1.PUSH 将操作数存入堆栈,同时修正堆栈指针;2.POP 将栈顶内容取出并存到目的操作数中,同时修正堆栈指针

 

参数的传递是靠寄存器和堆栈还完成的,高级语言中,子程序(函数、过程,或类似概念的东西)依赖于堆和栈来传递。

一般高级语言的子程序的执行过程:

u  调用者将子程序执行完成时应返回的地址、参数压入堆栈  

u  子程序使用BP指针+偏移量对栈中的参数寻址,并取出、完成操作  

u  子程序使用RET或RETF指令返回。此时,CPU将IP置为堆栈中保存的地址,并继续予以执行

调用子程序的指令是CALL,对应的返回指令是RET

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值