当前位置:文档之家› X86汇编语言

X86汇编语言

汇编(破解系列基础)(王爽汇编语言笔记第一版2013-8-1)(王爽汇编语言笔记第二版2013-8-11)笔记目录:第一章:基础知识(机器语言与汇编语言,及8086cpu的地址数据控制总线。

)第二章:寄存器cpu工作原理(寄存器的初步认识,字和字节概念,最主要的是8086cpu物理地址的表达方法,及汇编开始执行代码段。

)第三章:寄存器的内存访问(cpu是如何访问内存的,并附加一些简单的汇编指令,重要的是栈概念的引入。

)第四章:第一个程序(==,主要记录DEBUG是怎么用的......)第五章:[bx]和loop指令(循环的引入,及段前缀的概念。

)第六章:包含多个段的程序(包含多个段使程序使数据代码栈更加清晰)第七章:更灵活的定位内存地址的方法(引进SI DI16寄存器使程序寻址更加方便,模拟高级语言中数组和结构体表达,及and和or指令汇编指令。

)第八章:数据处理的两个基本问题(==)第九章:跳转指令的原理(jmp jcxz各种跳转地址表达方法,及offset操作符。

)第十章:call和ret(最重要,类似高级语言中函数的功能。

)第十一章:标志寄存器(各种”jump”,各种标志位...每次执行后可由标志位判断数据处理情况,破解中尤其重要。

)第一章:基础知识1:【机器语言】(010000001000000)0和1的组成2:【汇编语言】:每条汇编指令对应一条机器语言13BE:0100B80010MOV AX,1000(B8对应AX,0010高低字节对应1000,第十章中有详细的解释)3:【CPU对内存的读写】(8086CPU,X86)CPU到内存3条总线:控制总线地址总线数据总线①地址总线(内存索引):8086CPU一共16条,每条传送0或1。

②数据总线(CPU与外部的传送速度)③控制总线(多少种控制总线是CPU对外界器件有多少种控制,有些命令是几根控制线综合发出的)4:【RAM(随机储存)和ROM(只读储存)】RAM和ROM是内存,硬盘是外存。

①RAM主随机存储器②ROM刷BIOS储存引导设置(把病毒刷入BIOS…^^)③接口卡RAM比如显存第二章:寄存器CPU工作原理5:【8086CPU的寄存器】通用类:AX BX CX DX,16位寄存器。

通用类又可以分为高段(AH)低段(AL),也就是高字节和低字节8位段地址类:CS(代码段地址)DS(数据段地址)SS(栈段)ES(混合类)6:【段地址*16(十进制)+偏移地址=物理地址】【段地址*10H(十六进制)+偏移地址=物理地址】两个表达式表达的意思是一样的8086CPU内存空间有1MB,但8086CPU的地址总线只有十六位,2的16次方等于65536(0~65535)等于十六进制的FFFF,65536B/1024=64kb,也就是一个段的长度。

最后引进了段地址*16(十进制)+偏移地址=物理地址。

因为物理地址表达方法是十六进制*16相当于把十六进制向前移了1位,4个二进制等于16进制,FFFFF(10485575)/1024=1023KB(0~1023KB),【2的20次方等于10485575/1024=1024kb】1024KB等于1MB,所以段地址只用移一位在加上偏移地址,用【段地址:偏移地址】(debug)的方法就可以表达8086CPU索引的1MB了。

1230H=100100011000012300H=10010001100000000(二进制左移四位)12300H1230H*10H=12300HFFFFFH=FFF0*10H+FF7:【CS和IP(跳到哪执行)】CS段地址*10H+IP(偏移地址)=CS:IP(debug)汇编:修改CS和IP值(JMP CS:IP)直接跳转到某地址。

Debug:-R CS-R IPCS(代码寄存器)指到的内存段,当作代码要执行,执行汇编语句。

和DS一样的是数据都是十六,但一个解释为数据,一个解释为执行命令。

CS和IP决定从哪执行,把后面的数据当代码执行。

8:【Debug(调试程序)】-R查看寄存器值-T执行(CS:IP)-A写汇编指令-U查看(内存地址十六进制汇编指令)-D查看(二进制)-D段地址:偏移地址首偏移地址尾-E改写内存第三章:寄存器(内存访问)9:【内存器中字的存储】2byte=1字,8bit=1byte。

一个十六进制是4位二进制ADBF是一个字,AD,BF 是一个字节,对字于分低字节高字节。

例如:1单元D82单元263单元17一个字获取两个单元,1的地址单元字的数据是是26D8,因为2的地址单元是高字节,从高字节到低字节读(字的读法)10:【DS和address】DS从内存地址中读数据。

MOV AX,1000HMOV DS,AXMOV BL,[0]前面两句获取内存地址,1000(DS)是数据段段地址,[0]是偏移地址,1000:0。

MOV AL,[0]和MOV AX,[0]区别,一个是把地址当字节(八位)传送,一个是把他当字(十六位)传送,如果是MOV AX,[0]那么AX读取的地址是10001H(高字节)10000H(低字节)11:【栈】先进后出,后进先出。

栈底(高地址)栈顶(低地址),PUSH ax(将AX中数据推进栈中)POP AX(将栈顶的数据取出放入AX)SS:SP栈顶是随时变化的,SS:SP始终指向栈顶。

SS是段地址,SP栈顶偏移地址。

PUSH 推进栈时,栈顶向地址向低物理地址,所以SP-2。

POP出栈时SP+2逐步朝向栈底。

栈空时不存在栈,指向栈空间下一个单元。

PUSH:执行PUSH时,SP先-2,指向准备压入数据的低字节(从图中可看出高字节在下,低字节在上)POP:执行POP时,先将SS:SP指向的数据送入寄存器中,然后POP+2指向新的栈顶。

空栈:空栈时,SP指向栈空间的下一个单元,可以想象PUSH压栈SP-2,向上移两个单元,SP-1放高字节,SP-2放低字节。

也可以想象栈中只有两个单元时POP的情况...第四章:第一个程序13:汇编指令(翻译为机器码,比如MOV)伪指令(由编译器处理,比如assume ends)14:debug追踪查看。

编译的EXE文件所在的目录J:\new\debug new.exe(new.exe是编译过的文件)Debug的追踪数据,CX是文件的长度(字节),程序刚开始追踪,CX没有设值时。

程序加载的过程,首先找一段内存空间(SA),它的前256字节(100H)存放的是PSP (CMD与DEBUG交换数据区域),然后把它SA存入DS中。

总结表达是SA+10H:0000(程序的代码存放地址)SA+10H段地址,计算内存物理地址方法。

段地址×10H+偏移地址(0000)。

(SA+10H)×10H+0000,PSP(100H,256字节)目前来说上面的PSP不重要==第五章:[BX]和LOOP指令15:【[BX]和LOOP】[bx]偏移地址LOOP:循环,CX记循环次数。

每次执行到LOOP标号,CX-1,如果CX=0跳出循环,否则一直执行...嵌套循环时要注意CX多次赋值导致的程序错误。

点我寻找解决方法LOOP标号标号编译器会翻译成执行语句的偏移地址(IP),loop的最大距离FF的正负补码形式,后面会有详细的解释。

16:【LOOP和[BX]的联合应用】原题是将FFFF:0H~FFFF:BH中的字节数据相加,8位字节型不可直接加到16位的寄存器上,这样可能出现错误。

于是有了一种方法,简单的说是把字节数据放到低8位中,高8位设0,然后把高8为低8位结合成16位后。

17:【段前缀和一段安全的空间】修改默认的DS段寄存器,比如MOV AX,SS:[0]。

段地址SS偏移0单元内容放到AX 中。

一段安全空间,0:200~0:2FF。

第六章:包含多个段的程序18:【包含多个代码段程序】汇编查的地址不同,翻译的语句不同(一个字节内容对应指令,没有设入口点一堆字节乱对应)。

设置入口点辨别代码从哪个地址开始翻译。

使用入口标志符,前面的可以用DW定义数据,执行的时候从开始标识符执行CS:IP CS段地址不变IP加偏移19:【在代码段中使用数据】方法如同在代码段中使用数据一样(入口标识符前定义),如果定义8个字单元(0~15)数据,和8个字单元栈(16~31),因为栈的初始化是空的一堆0,所以sp指向的栈顶+2也就是栈的下一字节。

20:【包含多个段的程序】【assume cs:a,ds:b,ss:c】【mov ax,b mov ds,ax】第七章:更灵活定位内存地址的方法21:【AND和OR】AND和OR的运算补充:【XOR和NOT】XOR异或逻辑运算:XOR操作数一,操作数二,如果两个数相等为假,两个书不想等为1。

NOT非逻辑运算,NOT操作数一,对操作数取反吧==。

22:【ASCII】128位标准ASCII码,及扩展ASCII码。

23:【字符形式给出的数据】【db‘A’】定义的字节数据【dw‘A’】定义的字数据,A是字型的。

【db1,2,3】定义的1,2,3是字节数据。

24:【SI和DI】SI和DI十六的寄存器,作用和BX相似但不可以拆分成两个8位寄存器25:【bx+idate】偏移地址的组合,灵活运用。

比如【二维数组】26:【bx+si】比如【嵌套循环】,由于循环LOOP与CX绑定,所以进入第二层循环时会覆盖第一层循环导致程序错误。

这时栈便发生了他的作用,先进后出,可以用栈PUSH外层数据后进入内层循环,内层循环后在用POP恢复外层数据。

27:【bx+si+idata】……注意:[DI+SI]不可以用这种表现方式,BX是女的,SI和DI是男的。

[SI+DI]等于搞基。

第八章:数据处理两个基本问题28:【BX DI SI BP】BP默认段地址在SS中。

29:【数据处理位置的表达】1:立刻数直接包含在机器码中的数据(执行前在CPU缓冲器中)2:寄存器指令要处理的数据在寄存器中3:段地址×16+偏移地址指令要处理的数据在指定的内存中以上三种数据位置表达方式的翻译。

30:【寻址方式】1:直接寻址mov ax,[0]2:寄存器间接寻址mov ax,bx3:寄存器相对寻址mov ax,[bx+1]4:基址变址寻址mov ax,[bx+si]5相对基址变址寻址mov ax,[bx+si+idate] 31:【指令要处理的数据是多长】1:在寄存器位数的情况下MOV AX,10H这个指令处理16位MOV AL,10这个指令处理8位……2:在没有寄存器位数的情况下push AX栈一次推进2字节(sp-2)…….3:ptr指令制定访问单元是byte还是wordmov byte ptr ds:[10],1ds:[10]01mov word ptr ds:[10],1ds:[11]01ds[10]0032:【寻址方式的综合利用】模拟高级语言的数组及结构体33:【div指令】纠结的除法指令==,被除数放在AX或AX和DX中。

相关主题