1、汇编程序的开发,可以使用masm、radasm等集成开发环境,其中masm是微软自家的汇编语言集成开发环境, masm是Microsoft Macro Assembler 的缩写,是微软公司最早为x86微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm,现在有x64的版本。
2、调试汇编程序,可以使用windbg、ollydbg等动态调试器,其中Windbg是微软自家的调试器,但是对于新手来说往往不容易上手,而且本身学习汇编语言需要更细致的看到指令执行的效果,就学习而言,还是Ollydbg更好用一些。所以像上面介绍的radasm,本身就一起打包了Ollydbg。使用Ollydbg也有缺点,即没有x64版本,但是一般熟悉win32汇编的,估计x64汇编也很容易上手,如果必须调试64位的汇编程序,则还是上手Windbg。如下图所示:
关机下ExitWindowsEx断点,当程序断下后从堆栈中返回上一层,然后来到在返回的上一层的段首,如果是易语言的话可能会发现是一个jl跳到这那段的,然后在jl那段的段首retn。jl那段里面的代码好像有重启什么的功能,有的忘了,我一般就在Jl那段段首retn的,关机我只处理过易语言的,不知道其他语言是啥样的运行该指令不会对寄存器、内存以及堆栈造成任何影响,英文意思是”无 *** 作”,它没有特殊的用途例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误多余的空间将会被NOP填充
适当数目的nop指令可以将其他指令完全替换掉
将 *** 作数压入堆栈,PUSH *** 作后会更新ESP指向新的栈顶地址,可 *** 作数值、寄存器和内存地址
堆栈保存数据窗口中颠倒过来的值,即倒序放置,读/写的内容在内存中倒序是处理器的特点之一
如data(CA 20 40 00)则stack(00 40 20 CA)
PUSH 401000 将数据401000压入栈
PUSH [401000] 取内存地址为401000中的数据压入栈
它会取出堆栈顶部的第一个字母或者第一个值,然后存放到指定的目标地址内存单元中
POP *** 作后会更新ESP指向新的栈顶地址
如,POP EAX从栈顶中取出第一个值存放到EAX中,随后的一个值随即变成栈顶
指令把所有通用寄存器的内容按一定顺序压入到堆栈中,相当于
"PUSH EAX,PUSH ECX,PUSH EDX,PUSH EBX,PUSH ESP,PUSH EBP,PUSH ESI,PUSH EDI"
PUSHA 等价于 "PUSH AX, CX, DX, BX, SP, BP, SI, DI"
与PUSHAD正好相反,它从堆栈中取值,并将它们放到相应的寄存器中,相当于
"POP EDI,POP ESI,POP ESP,POP ESP,POP EBX,POP EDX,POP ECX,POP EAX"
POPA 等价于 "pop DI, SI, BP, SP, BX, DX, CX, AX"
PUSHA,POPA/PUSHAD,POPAD在16位程序中使用,我们不感兴趣,OllyDbg是一个32位调试器
该指令将第二个 *** 作数赋值给第一个 *** 作数,如: MOV EAX, EBX
p2是寄存器也可能是内存单元,p1的位数比p2多,p2的符号位填充p1剩余部分
如:
EAX = 00000000,BX = F000
MOVSX EAX,BX
执行后EAX = FFFFF000,因为F000是负数,所以EAX的高位用F填充
EAX = 00000000,BX = 7FFF
MOVSX EAX,BX
执行后EAX = 00007FFFF,因为7FFF是正数,所以EAX的高位用0填充
16位范围0000~FFFF, 正 0000~7FFF, 负8000~FFFF
32位范围00000000~FFFFFFFF, 正 00000000~7FFFFFFF, 负80000000~FFFFFFFF
MOVZX类似于MOVSX,但是这种情况下,剩余的部分不根据第二个 *** 作数的正负来进行填充
剩余的部分总是被填充为0
类似于MOV指令, 但是第一个 *** 作数是一个通用寄存器,并且第二个 *** 作数是一个内存单元。
当计算的时候要依赖于之前的结果的话,那么这个指令就非常有用。
如:
LEA EAX, DWORD PTR DS:[ECX+38]
在这个例子中,LEA指令就计算ECX + 38的值,然后将计算的结果赋值给EAX
因为完成的是赋值 *** 作,所以我们会认为 *** 作数是内存单元中的值,
但实际上, *** 作数仅仅是内存单元的地址,而不是里面的内容
该指令交换两个 *** 作数的值
如:
XCHG EAX,ECX
EAX的值将被存放到ECX中,反之亦然,也可以交换寄存器和内存单元的值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)