汇编入门先导
1.首先知道为什么要学习汇编
汇编语言是底层的语言,是直接与机器交流的语言,汇编语言就是人能理解的语言转化为机器能理解的语言。学习计算机的底层逻辑,可以帮助我们在解决一些别的语言的bug的时候如有神助。
众所周知我们的计算机只能知道两个东西:0,1
我们所有的计算机程序都是建立在0,1上,对于计算机来说就是两个电平,高电平为1,低电平为0,通过电平的变化来进行处理,对于计算机来说,加减乘除都是建立在加法的基础上。
小问题:在计算2的三次方的时候什么计算方式最快?
答案:位运算,把二转化为10 然后进行移位运算得到1000,对于计算机这就是最快的运算方式。
那么该如何进行汇编语言的入门学习呢?
可以分为这几个步骤
数据宽度
常见的有:
bit :一位 0-1
byte:八位 0-0xff
word:十六位 0-0xffff
dword(双字)) :三十二位 0-0xffffffff
我在这里就只写出常见的一些汇编指令,让大家可以看懂OD中每个语句的意思。
在列出汇编指令之前,我们先来看一下汇编指令会把数据放到什么地方去。
先来看一个我们十分常用的软件OD
这个页面有四个模块,左上是汇编,右上是寄存器,左下是内存,右下是堆栈信息。
寄存器:
存储数据:CPU >内存>硬盘
通用寄存器
32位的只有8个通用寄存器
存值的范围:0-FFFFFFFF
1.如何向寄存器从入指令
mov 指令
关于mov指令指令,通常他是这个样子的
mov 寄存器1,寄存器2(mov eax,ecx)
mov 寄存器,数据(mov eax,1)
2.call(调用)
call指令将当前的相对地址压入栈中,调用call后的子程序,在子程序中相应的则会有ret n 指令
3、j型跳转
可以跳转到该指令后的一个地址,可以跳转到某个函数代码执行的入口或者不满足条件跳转执行其他指令
JE ;等于则跳转
JNE ;不等于则跳转
JZ ;为 0 则跳转
JNZ ;不为 0 则跳转
JS ;为负则跳转
JNS ;不为负则跳转
JC ;进位则跳转
JNC ;不进位则跳转
JO ;溢出则跳转
JNO ;不溢出则跳转
JA ;无符号大于则跳转
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转
JG ;有符号大于则跳转
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转
JB ;无符号小于则跳转
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转
JL ;有符号小于则跳转
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转
JP ;奇偶位置位则跳转
JNP ;奇偶位清除则跳转
JPE ;奇偶位相等则跳转
JPO ;奇偶位不等则跳转
4,jmp
jmp 段地址:偏移地址
功能:修改CS、IP的内容
例子:jmp 55BA:8
执行后:(CS)=55EAH, (IP)=0008H
jmp 偏移地址
功能:修改IP的内容
例子:jmp 8
执行后: (IP)=0008H
5.ret
ret指令是从代码区域退出到调用CALL指令处
6.push(入栈)
栈是一种特殊的数据结构,栈空间也是内存空间,遵从“先进后出,后进先出”的原则
push reg
push sreg
push 内存单元
将寄存器,段寄存器或内存单元中的值存入栈中,保存,在下次使用是用pop指令再取出
7.pop(出栈)
pop reg
pop sreg
pop 内存单元
将值从栈中取出放置于寄存器,段寄存器或内存单元中,一般push和pop指令会与其他指令同时使用,
达到所需要功能(例:函数传参,函数跳转等等)
在CPU中存在SS和SP寄存器用于保存栈顶的地址,仅SP的值可以进行改变,push指令改变SP,进行内
存写入;pop指令读取SS:SP处的值,再修改SP的值
8.add(加法)
add 寄存器,数据 例:add ax,8
add 寄存器,寄存器 例:add ax,bx
add 寄存器,内存单元 例:add ax,[0] 注:这里的0代表的是偏移地址,段地址放在ds寄存器中
add 内存单元,寄存器 例:add [0],ax
最后运算的结果保存在第一个对象中,加法指令对ZF,OF,CF标志寄存器会产生影响,以下减法相同
以上就是常见的汇编指令当然这些根本不算是学习汇编语言,这只是可以让我们在看到OD等软件中的语句不在那么迷茫。