汇编指令学习总结
更新时间:2023-11-10 02:37:01 阅读量: 教育文库 文档下载
- 微机原理汇编指令总结推荐度:
- 相关推荐
看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚. 首先看看:状态寄存器(即标志寄存器)
PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成, 如下所示:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF 条件码:
①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.
②SF(Sign Flag)符号标志,结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0. 控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。
为举例方便说一下jnz和jz 测试条件 JZ ZF=1 JNZ ZF=0
即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转) Jnz=jump if not zero 好,接着来看test和cmp
*******************************************************************************
test属于逻辑运算指令
功能: 执行BIT与BIT之间的逻辑运算
测试(两操作数作与运算,仅修改标志位,不回送结果).
Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST AX,BX 与 AND AX,BX 命令有相同效果 语法: TEST r/m,r/m/data
影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) 运用举例:
1.Test用来测试一个位,例如寄存器:
test eax, 100b; b后缀意为二进制
jnz ******; 如果eax右数第三个位为1,jnz将会跳转
我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.
2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空: test ecx, ecx jz somewhere
如果ecx为零,设置ZF零标志为1,Jz跳转
*******************************************************************************
CMP属于算术运算指令
功能: 比较两个值(寄存器,内存,直接数值) 语法: CMP r/m,r/m/data 标志位: C,P,A,Z,O
CMP比较.(两操作数作减法,仅修改标志位,不回送结果).
cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志). 零标志很像carry,也是内部标志寄存器的一位. 例如:
Cmp eax, 2; 如果eax-2=0即eax=2就设置零标志为1 Jz ****; 如果设置了零标志就跳转
******************************************************************************* 我得出的结论
test逻辑与运算结果为零,就把ZF(零标志)置1; cmp 算术减法运算结果为零,就把ZF(零标志)置1.
TEST - Test For Bit Pattern //位测试指令
Usage: TEST dest,src //用法:TEST dest,src
Modifies flags: CF OF PF SF ZF (AF undefined) //受影响的标志位有:
//你要注意的是这一部位才对。你上面的指令test eax,eax后面跟着的是jnz指令,jnz指令作用于零标志位的,若零标志位不为零则跳,所以test eax,eax是测试eax是否为零的指令,若eax有数据,不管是什么数据(111也好,101也好),jnz都会跳。
//更新一下,若eax有数据,不管是111也好,222也好,只要他们两个操作数作逻辑与运算之后,结果不为零,则jnz都会跳。而jz则不跳。 CF //进位标志,主要作用于JC/JNC指令。 OF //溢出标志,主要作用于JO/JNO指令
PF //奇偶标志,主要作用于JP/JPE/JNP/JPO指令 SF //符号标志,主要作用于JS/JNS指令
ZF //零标志,主要作用于JZ/JE/JNZ/JNE指令
AF //辅助进位标志,不过未定义。
Performs a logical AND of the two operands updating the flags //执行两个操作数的逻辑与运算,并更新标志位。 register without saving the result.
//该操作只修改标志位,不保留运算结果值。
已经有经验的知道TEST指令是对寄存器或者说对两个操作数进行逻辑与,然后影响标志寄存器。
最常见的指令是TEST EAX,EAX, 但是如何逆向出TEST指令呢? 对我们新手来说正向经验不足是个难度。
开始的时候 我也不知道从何下手得到这 TEST指令, 我就随便看Object Pascal官方中文版的书,
然后反出来看, 于是渐渐的TEST指令就出来了。 而实际要逆出的指令是这一组, 不妨我们都逆逆看。
0040899C |. 8B1D 4CD24000 mov ebx, dword ptr [40D24C] ; NoPacker.0040D164
004089A2 |. 8B5B 18 mov ebx, dword ptr [ebx+18] 004089A5 |. 85DB test ebx, ebx
004089A7 |. 74 12 je short 004089BB
004089A9 |. A1 4CD24000 mov eax, dword ptr [40D24C]
004089AE |. E8 DDB9FFFF call
004089B5 |. 0F85 D2030000 jnz 00408D8D
004089BB |> BA 9CE94000 mov edx, 0040E99C
一、
(1)函数调用
00407CDC |. B8 FC7C4000 mov eax, 00407CFC ; ASCII \00407CE1 |. E8 8AFFFFFF call 00407C70
00407CE6 |. B8 087D4000 mov eax, 00407D08 ; ASCII \ld\
00407CEB |. E8 90FFFFFF call 00407C80
(2)另外一种形式的 如 MessageBox(0, PChar(varb), PChar(varb2), 0); 00407CBF |. 6A 00 push 0
00407CC1 |. 8B45 F8 mov eax, dword ptr [ebp-8] 00407CC4 |. E8 77BCFFFF call 00403940 00407CC9 |. 50 push eax
00407CCA |. 8B45 FC mov eax, dword ptr [ebp-4]
00407CCD |. E8 6EBCFFFF call 00403940
00407CD2 |. 50 push eax ; |Text
00407CD3 |. 6A 00 push 0 ; |hOwner = NULL
00407CD5 |. E8 8EC8FFFF call
(3)两个整型参数 func(90, 90);
00407D3A |. BA 5A000000 mov edx, 5A 00407D3F |. B8 5A000000 mov eax, 5A 00407D44 |. E8 47FFFFFF call 00407C90
(4)将两个值相加再转为string tmpStr:=IntToStr(a + b); 00407CB8 |. 8D55 FC lea edx, dword ptr [ebp-4] 00407CBB |. 8D041E lea eax, dword ptr [esi+ebx] 00407CBE |. E8 01D6FFFF call 004052C4
(5)值相加tBuf := Integer('A'); tmpStr:=IntToStr(a + b + tBuf);
00407CB9 |. BB 41000000 mov ebx, 41
00407CBE |. 8D55 FC lea edx, dword ptr [ebp-4] 00407CC1 |. 8D0437 lea eax, dword ptr [edi+esi] 00407CC4 |. 03C3 add eax, ebx
00407CC6 |. E8 F9D5FFFF call 004052C4
(6)获取一个函数指针
00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax
(7)来回传递 F := Func(P); Func(P) := F;
00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax 00407CC3 |. A1 9C974000 mov eax, dword ptr [40979C] 00407CC8 |. A3 A0974000 mov dword ptr [4097A0], eax
(8) 相同的反汇编结果 @F := P; 和 F := Func(P);
00407CB9 |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CBE |. A3 9C974000 mov dword ptr [40979C], eax
00407CCD |. A1 A0974000 mov eax, dword ptr [4097A0] 00407CD2 |. A3 9C974000 mov dword ptr [40979C], eax
P := @F; 和 Func(P) := F;也是相同的
(9)调用 N := F(N);
00407CDC |. A1 A4974000 mov eax, dword ptr [4097A4] 00407CE1 |. FF15 9C974000 call dword ptr [40979C]
00407CE7 |. A3 A4974000 mov dword ptr [4097A4], eax
(10) N := Func(P)(N);
00407CEC |. A1 A4974000 mov eax, dword ptr [4097A4] 00407CF1 |. FF15 A0974000 call dword ptr [4097A0]
00407CF7 |. A3 A4974000 mov dword ptr [4097A4], eax (11)
00407CB9 |. BB 03000000 mov ebx, 3 ; I := 3
00407CBE |. 8D55 FC lea edx, dword ptr [ebp-4] ;得到tmpStr地址 00407CC1 |. 8D0437 lea eax, dword ptr [edi+esi] ;edi+esi就是90+90 00407CC4 |. 03C3 add eax, ebx ; I + edi + esi值
00407CC6 |. E8 F9D5FFFF call 004052C4 ; 存储在tmpStr内 (12)
00407CB9 |. BB 03000000 mov ebx, 3 ;I := 3 00407CBE |. 43 inc ebx ;I := I+1;
(13)当不自动为变量初始化时Delphi会自己给变量初始化, 形态是这样的。 //一般不是自己手动的临时变量要么是作为输入参数要么是作为中转存储。 00407C9B |. 894D F8 mov dword ptr [ebp-8], ecx 00407C9E |. 894D F4 mov dword ptr [ebp-C], ecx 00407CA1 |. 8955 FC mov dword ptr [ebp-4], edx
(14)Delphi的临时栈空间是在每个函数的后面。 00407D1F 00 db 00
00407D20 . FFFFFFFF dd FFFFFFFF 00407D24 . 14000000 dd 00000014
00407D28 . 4D 69 63 72 6F 73 >ascii \00407D38 . 6C 61 6E 64 00 ascii \00407D3D 00 db 00 00407D3E 00 db 00 00407D3F 00 db 00
如这段, 它在00407D1F之前存在一个函数将引用此段内某临时变量。
(15) 一个逻辑表达式 Done := (I>=1) and (I<100); 00407CB6 |. 83FB 01 cmp ebx, 1 (1) 00407CB9 |. 7C 05 jl short 00407CC0 00407CBB |. 83FB 64 cmp ebx, 64 (100)
正在阅读:
汇编指令学习总结11-10
幸福的滋味作文700字04-01
日照职业技术学院大学生艺术团章程01-27
春节的习俗02-24
职业健康安全案例题201309-09
2022北京冬季奥运会知识汇总05-02
《宪法学》教学案例、习题集10-05
强化后备必用观念 锤炼过硬战斗精神10-21
“三二一星”长辈作文350字07-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 汇编
- 指令
- 总结
- 学习
- 画法几何与阴影透视(下)复习提要( 2011.06)(1)
- 平行线中常见拐角问题
- 2018年黑龙江省伊春市中考数学试卷(答案+解析)
- 案例分析采购高手谈怎样由员工到采购
- 企业党风廉政特邀监督员工作管理办法
- 浙江省2015年4月高等教育自学考试儿童文学概论试题
- 联系实际分析阐述唯物辩证法三大基本规律的现实意义
- MARS6 XPRESS操作规程
- 2011年临床执业助理医师实践技能考试真题(7月1日)汇总(最全版)
- 缓解贫困地区中小企业融资难的思考和建议
- PKPM数据分析
- 八年级数学全等三角形新课讲义完整版(全8讲)
- 数学建模作业
- 篮球考试资料
- 初三数学第4讲:三角形一边的平行线判定定理
- 化工原理第三章习题及答案
- 外国建筑史期末考试复习重点知识点简答大题
- 第二届全国高校无机非金属材料基础知识大赛决赛试题
- 高中历史题型专练:全国卷41题小论文
- 时代光华《企业知识管理实施》课后试题答案