汇编笔记

  • 格式:doc
  • 大小:16.23 MB
  • 文档页数:54

First step:进阶——《汇编语言的艺术》病毒木马——《win32汇编语言设计》第一章Basic 知识1.硬件上工作2.汇编思维,C语言的技术3.机器语言(指令)——>汇编语言(机器指令便于记忆的书写格式)4.寄存器:CPU中可以存储数据的器件汇编语言的产生:.6.组成:i.汇编指令(机器码的助记符)ii.伪指令(编译器执行,)iii.其他符号(编译器识别)核心:汇编指令存储器指令和数据在存储器中存放,也就是内存磁盘(硬盘)不同于内存,是静态存储着数据虚拟内存的读取速度比较慢指令和数据应用上的概念存储单元从零开始编号存储器被划分位若干单元CPU对存储器的读写交互:地址(存储单元)控制(器件选择、读写)数据(读或写的数据)总线(逻辑):地址:控制:每一个对应一个设备数据:8088 CPU(16位)三者的宽度对于量、传输速度、控制能力等都很重要总结:每一种CPU都有自己的汇编指令集内存地址空间主板:接口:CPU通过接口卡间接控制空间分配:第二章CPU工作原理(寄存器)CPU:运算器、控制器、寄存器(内部总线相连)外部总线:实现CPU和主板上的其他器件的链接寄存器:8通用:都是16位,可以存放两个字节AX BX CX DX 存放一般性数据逻辑结构:例子:数据:18D二进制:10010B在寄存器AX中的存储:BUT:8086上一代CPU的寄存器都是8位保证兼容性,分为low和high两部分AL&AH6其他的目录字在寄存器中的存储WORD = 2 B字如AX为20000而不是7832,是以16位为单位低位的寄存器数据相加,不能向高位进位数制的谈论H 、O 、D 、B用十六进制可以更直观的看出这个数据是有哪些8位数据表示汇编指令不区分大小写2.4物理地址CPU访问内存单元式要给出内存单元的地址2.5 16位结构的CPU1.运算器一次最多可以处理16位的数据2.寄存器的最大宽度为16位3.寄存器和运算器之间的通路是16位2.6 8086CPU给粗的物理地址的方法外部20位地址总线,可以传送20位地址,1M内部16位结构,只能传送16位解决:二合一段地址、偏移地址——>地址加法器第一个比喻:分段:基础地址+偏移地址第二个比喻:用于传递2826段的概念实质:内存并没有分段,段的划分来自于CPU注意:偏移地址为16位,16为地址的寻址能力为64K,所以一个段的长度最大为64k,变化范围为CPU可以通过不同的段地址和偏移地址形成同一个物理地址总结:段寄存器CS、DS、SS、ESCS:代码段寄存器IP:指令指针寄存器(instruction pointer),当执行完一个指令,IP自动递增当前的指令的地址大小。

这两者对于CPU来说,CS:IP指向的内存单元的内容为指令转移指令:jmp1.同时修改CS、IP的内容2.仅修改IP的内容:跳转到3.答案:实验1 查看CPU和内存Bug:臭虫、小虫;故障视频12的实验第三章寄存器(内存访问)3.1内存中字的存储在0地址开始存放20000(4e20H)0地址单元中存放的字型数据:20000(4e20H)字节型数据:20H结论:任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以将它们看成一个地址为N的字单元中的高位字节单元和低位字节单元。

3.2 DS和【address】CPU读取数据DS存放要访问的数据的段地址例子:读取10000H单元的内容:8086CPU不支持将数据直接送入段寄存器的操作,DS是段寄存器逆向思维:3.3 字的传送执行下列命令:3.4 mov、add、sub 指令mov 寄存器,段寄存器——okAdd 和sub 对段寄存器的操作:实验验证不可以。

3.5 数据段例子:再将元指令改为:累加数据段的前三个字型数据改动;第三行的al改为ax3.6 栈操作方式:先进后出Pop和push 都是操作值当栈为空时,SS指向1000H,SP则指向栈的栈底位置的再下一个位置3.7 CPU提供的栈机制8086cpu提供计算机将内存中的一块当做栈使用3.8 栈顶越界的问题即使用push和pop时,超出栈分配的空间push导致溢出pop 导致下溢问题:覆盖了其他应用和系统的数据黑客:溢出攻击8086CPU工作的原理:当前栈顶位置当前要执行的指令时哪一条3.9 push、pop指令可以操作寄存器和内存单元Push ax Push dsPop bx Pop esPush [0] pop [2]例子:分配一段空间10000H~1000FH 为栈,初始状态为空应用:但是:3.10 栈段在编程时,将一组内存单元定义为一个段0~FFFFHSS为16位的段寄存器可以将长度为N(N<=64K)的一组地址连续、起始位置为16的倍数的内存单元栈的意义:临时存放数据而已,为了函数调用数据而存在第四章第一个程序a)一个源程序从写出到执行的过程i.编写1.使用文本编辑器(记事本,Ultraedit等)2.编译(masm.exe)3.链接(link.exe)4.可执行文件5.执行()b)源程序i.汇编指令ii.伪指令:不被机器执行,被编译器执行1.Segment和ends一对伪指令a)定义一个段b)标识名称2.end程序结束标志3.assume假设iii.程序源程序中最终由计算机执行、处理的指令或数据iv.标号1.指代地址2.Codesg作为一个段的名称v.程序返回一个程序执行结束后,将CPU的控制权交给使它得以运行的程序,这个过程即程序返回。

如:cmd.exe的程序运行1P.exe程序之后,系统又将控制权交给cmd.exe如何返回:中断机制:在程序末尾添加。

vi.Dos中程序运行:单任务操作系统c)iii. 编辑源程序i.文件名.asmii.上机1.masm 文件名.asm2.link 文件名.obj3.加上分号“:”会少很多的废话Iii. EXE执行执行之后返回。

屏幕再次出现操作系统的提示符d)编译和链接1.连接:⑴将很大的源程序分为多个源程序编译;编译成目标文件后,再连接起来生成一个可执行文件⑵将某个需要用到的库中子程序与目标文件连接,生成可执行文件.e)以简化的方式进行编译和链接f) 1.exe的执行i.ii. Ciii.操作系统的外壳1.Shell的外壳,用户(操作人员)使用这个程序来操作计算机2. Cmd.exe 也是一个dos系统外壳g)可执行文件中的程序装入内存并运行的原理fishcc是可以随意改变,只是作为标志h)程序执行过程的跟踪Debug观察程序运行的过程cx中存放的是程序的长度:0121H—r 查看改程序的段分布:075a~076A查看cs代码段中的相关指令:遇到int 21时,用p执行表示程序结束。

总结:1.debug:反编译程序,是用来运行编译连接好的程序(exe),其中有—R、—T、—U等命令2.masm、link用来编译连接源程序注意:在用debug编程与debug 2.exe不同,会出现源程序中是al,【0】,而编辑器编译之后,会变成al,0,偏移地址成了值第五章【BX】和loop指令5.1 【BX】What:和【0】有点类似5.2 loop指令循环:格式:loop 标号操作:cx 存放循环的次数例子:(哥哥自己编出来的)1.标号Again本身在CPU运行时,会分配一个偏移地址,方便用于循环时绕回去找到。

2.mov cx,11应当靠近循环体Loop 操作时:描述性符号“()”表示一个寄存器或一个内存单元的内容(ax)=0010H约定符号idata表示常量:等同还有就是:是非法的5.3 在debug中跟踪用loop指令实现循环程序所以要在前面加0(是零哦),否则编译器不认识。

对付循环次数过多:G命令过程:1.运行程序:.exe2.R命令查看代码地址:3.U命令跳转到4.查看结束指令地址:5.G命令跳转到6.T命令运行7.P命令结束!经检验:操作通过!2 * 25 = 50=32HP命令直接到转到结束语句,循环完成5.4 debug和汇编编辑器masm对指令的不同处理对于:MOV ax,【0】的识别debug: mov ax , [0]这里是直接编程,运用a 命令,写入指令R命令修改ip到当前的偏移地址T命令运行指令Masm: mov ax, 00——>需要用到【BX】还有方法:加上段地址5.5 loop和【BX】的联合应用内存单元中的数据是8位,DX是16位如果仅用dl存储的话,8位不足以负担总结果、问题:类型匹配:结果不越界方法:加入附加寄存器:AX想到:综合:这里的【】中可以放变量5.6 段前缀MOV ax,cs:[0] 中的cs就是前缀5.7 一段安全的空间避免胡乱删改其他系统程序的数据和代码便于:自由、直接地用汇编语言去操作真实的硬件SO:Why:!5.8 段前缀的使用例子:注意:每次循环,涉及两次的ip指针调动,所以每次循环都要设置两次DS。

优化:——>加入ES寄存器作为目标寄存器。

第六章包含多个段的程序6.1 在代码段中使用数据DW:define word 定义字型数据DB: define byte 定义字节数据后面的数据用逗号隔开。

存放:代码段End :除了通知编译器程序结束外,还可以同志编译器程序的入口在什么地方。

编译器在编译的时候,是找到end 后面的标号,找到入口6.2 在代码段中使用栈6.3 将数据、代码、栈放入不同的段规格:我们定义的段中内容,是通过程序中具体的汇编指令。

问题:如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:16x(N/16+1)解析:每个段,系统最低自动分配16个字节。

第七章更灵活的定位内存地址的方法1.And 和or 指令a)And指令:逻辑与指令,按位进行化零第几位是按照数组的原则来说的。

b) or 指令:逻辑或指令,按位进行或运算(设壹)2.AScII码便于统一编码的规则3.以字符型式给出的数据a)方式:‘XXX ’4.大小写转换的问题代码:小写转大写:大写转小写:5.[bx + idata]a)偏移地址:(bx)+ idata (bx中的数值加上idata)b)格式:都一样。

6.用[bx + idata]的方式进行数组的处理Bx作为变动的那个量可以从高级语言的角度看:7.SI和DI与BX的功能相似,但是不能分开为8位的寄存器。

改进后:单用si8.[bx + si ] 和[bx + di]等价于9.[bx + si + idata]和[bx + di + idata]10.不同的寻址方式的灵活应用一个变量、一个常量、一个变量+常量……多层循环:Loop指令默认CX为循环计数器。

CX在两层之间会导致死循环。