汇编指令 寄存器 助记符
汇编指令是汇编语言中使用的一些操作符(例如:mov,push)
也叫助记符
它既不控制集齐的操作,也不被汇编成机器代码 只能为汇编程序所识别并指导汇编如何进行
汇编指令 是 汇编语言中的关键字文章源自楠竹林-https://www.nanzl.com/archives/118
汇编指令的格式和特点文章源自楠竹林-https://www.nanzl.com/archives/118
操作码 [操作数] [;注释]
[]方括号的部分可有可无 但操作码 部分 是必须具备的文章源自楠竹林-https://www.nanzl.com/archives/118
举个例子
操作码 操作数 注释文章源自楠竹林-https://www.nanzl.com/archives/118
Mov ax,1234H ;将立即数1234H送入到AX寄存器里存放着文章源自楠竹林-https://www.nanzl.com/archives/118
操作码:操作码是由助记符表示的字符串,它规定了指令的操作功能,操作码和操作数之间由一个空格分开文章源自楠竹林-https://www.nanzl.com/archives/118
操作码 空格 操作数
例如:Mov ax,1234H文章源自楠竹林-https://www.nanzl.com/archives/118
操作码这个位置一直都是放汇编指令的 例如 mov push 等各种指令
例如 Mov ax,1234H 里的操作数 ax,1234H ax是操作数1 操作数2是1234H
当操作数 数量大于1个以上 就要将操作数用, 逗号隔开文章源自楠竹林-https://www.nanzl.com/archives/118
注释:注释是为了该指令做一个说明注解
Mov ax,1234H ;将1234H传入AX寄存器中存放着文章源自楠竹林-https://www.nanzl.com/archives/118
凡是一个数的结尾是B或b : 表示该数值为二进制数值 例如 10101010B或10101010b
凡是一个数的结尾是H或h : 表示该数值为十六进制数值 例如 1234H或1234h
凡是一个数的结尾是D或d : 表示该数值为十进制数值 例如 1223D或1223d
凡是一个数值中没有包含这些字符 那么这个数值默认为十进制数值 例如 1200文章源自楠竹林-https://www.nanzl.com/archives/118
文章源自楠竹林-https://www.nanzl.com/archives/118
备注:十六进制数值如果数值的开头为A~F时,则必须在这个数值的前面加个0,否则汇编程序认为这个数值是一个标号从而导致编译过程中出错文章源自楠竹林-https://www.nanzl.com/archives/118
文章源自楠竹林-https://www.nanzl.com/archives/118
---------------------------------------------------
MOV 数据传送指令 格式 Mov DST,SRC 功能:该指令把源操作数SRC的数据传送至目的操作数DST中去文章源自楠竹林-https://www.nanzl.com/archives/118
列如: Mov eax,1234h 解析 把1234h十六进制数值传送到EAX 32位的数据寄存器中去
EAX寄存器中的值也就变成了1234H了文章源自楠竹林-https://www.nanzl.com/archives/118
---------------------------------------------------
示列文章源自楠竹林-https://www.nanzl.com/archives/118
mov eax,[0069BA8C] ; 把括号内的地址里的内存值传送给EAX寄存器中
mov eax,[eax] ; 把EAX寄存器里的值得内存值传给EAX
mov eax,[eax+00000114]; 把EAX寄存器的值+括号内的偏移量只想内存地址的值传送给EAX
sub eax,09 ;
mov eax,[ebp-80] ; 把EBP的值-80指向的内存地址的值传送给Edx寄存器里文章源自楠竹林-https://www.nanzl.com/archives/118
备注:mov eax,[0069BA8C] 中的0069BA8C 被方括号[]括住表示是提取0069BA8C这个内存地址里的值传送给EAX寄存器
---------------------------------------------------
PUSH 入栈指令 格式 PUSH 操作数 指令功能 将操作数压入到堆栈的栈顶
指令三种形式表达式
PUSH AX ;压入各种寄存器里的值入堆栈
PUSH 123H ;压入一个直接数入堆栈
PUSH [EDI+2c] ;压入[寄存器+偏移量]指向的内存地址中的值入堆栈
以上三种表达式是合法指令格式
---------------------------------------------------------------------------文章源自楠竹林-https://www.nanzl.com/archives/118
POP 出栈指令 凡是看见一段反汇编子程序有PUSH 那么后面就有POP出栈指令
指令格式: 操作码 操作数 指令功能 将堆栈顶端的数据弹出到操作数中文章源自楠竹林-https://www.nanzl.com/archives/118
例如:POP AX 解析:弹出堆栈到AX寄存器中去文章源自楠竹林-https://www.nanzl.com/archives/118
PUSH EAX 把EAX寄存器的内容压入堆栈
PUSH ECX 把ECX寄存器的内容压入堆栈
MOV ECX,ESI 把ESI寄存器的内容传送到ECX寄存器中去
CALL clientgu.0097B470 调用函数入口
POP ESI 弹出堆栈到ESI寄存器中去
RETN 8 返回表示2个参数操作数
RET 返回指令 格式:ret 功能:这个指令一般作为子程序的结束指令,使子程序返回
例如
PUSH EBP 子程序入口
MOV EBP,ESP
MOV ESP,EBP
POP EBP
RETN 子程序尾部
LEA 地址传送指令 格式:LEA AX,[BX+3] ;将BX+3的有效地址传送到AX寄存器里去
例如 这里的BX值=2000H 那么这条汇编语句经过这个LEA指令执行过后 ,那么AX寄存器的值就是2003H
XCHG 交换指令 指令格式: XCHG AL,AH ;将高八位AH寄存器里的内容与低八位AL寄存器交换
指令功能:将两个操作数的内容互相交换给对方
假如:这里的AH的值为100H AL的值是200H 经过XCHG交换指令交换后 AH的值为200H AL的值为100H
jmp 无条件转移指令 格式:Jmp 标号
jmp 7C92E2DC ;直接无条件跳转到 7C92E2DC 地址 然后继续从 7C92E2DC 执行下去
指令功能 : 无任何条件直接跳转到某个地址处
备注:如果这个指令中的标号是直接给出的一个地址,那么称之为直接转移
如果这个指令中的标号是间接的方式给出的目的地址 那称之为间接转移
例如 HMP DWORD PTR DS:[EAX]
转移的目的地址为执行到当前EAX寄存器里的内容地址
sub 减法指令 格式:操作数1,操作数2 功能:实现两个操作数相减,相减后的结果存放在目的操作(操作数1)里面
例子:SUB ESP,8 ; 将ESP寄存器里的内容 与 8 相减 最后结果存放在ESP寄存器里
如果ESP寄存器的值为10 那么 将ESP减去8等于2的值存放在ESP里
ADD 加法指令 格式:ADD 操作数1,操作数2 功能:将两个操作数相加,结果存放在操作数1里面
例子:ADD ESP,8 ; ESP寄存器的内容与8相加 结果存放在ESP寄存器里面
汇编格式里的操作数之间分 目的操作数和源操作数
NOP 无操作指令 格式:NOP 功能 这个指令的功能就是不操作
当我们将某一段指令改成NOP 当程序执行到这里就不会再执行下去了
例子
PUSH 7D0 ;压入2000
PUSH 3E8 ;压入一千
CALL 004014B5
执行完成后这个函数返回的结果原本是3000
但是我们将这CALL指令改成NOP执行 那么它返回的将不会再是3000 而是-1 或 0
CALL 过程调用指令 在模块化的程序设计中,通常程序员会把一个较大的程序分解成若干个有独立功能的程序模块,这些独立的功能模块称之为子程序或执行过程(代码块)
在程序中,可由调用程序调用这些子程序,而CALL指令可以实现子程序的调用
另外 CALL指令我们通常也称之为调用指令 , CALL指令可以调用同一个代码段的子程序,也可以调用另外一个代码段的子程序。
CALL 过程调用指令 作用是调用指定某个子程序入口 执行那个子程序
评论