浅学汇编
基础知识
汇编指令是机器指令的助记符,同机器指令一一对应。
每一种CPU都有自己的汇编指令集
CPU可以直接使用的信息在存储器中存放
在存储器中指令和数据没有任何区别,都是二进制信息
存储单元从0开始顺序编号
一个存储单元可以存储8个bit,即8位二进制数
每个CPU芯片都有许多管脚,这些管脚和总线项链。也可以说,这些管脚引出总线。一个CPU可以引出三种总线的宽度标志了这个CPU的不同方面的性能
{
地址总线的宽度决定了CPU的寻址能力 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量 控制总线的宽度决定了CPU对系统中其它器件的控制能力}

CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
区别:
内部总线实现CPU和主板上其它器件的联系。
外部总线实现CPU和主板上其它器件的联系。
8086CPU有14个寄存器,他们的名称为:
AX、BX、CX、DS、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
8086CPU所有寄存器都是16位的,可以存放两个字节。
AX BX CX DX通常用来存放一般性数据,被称为通用寄存器
为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
AX可以分为AH(高八位,8
15)和AL;(低八位 07)BX可以分为BH和BL;
CX可以分为CH和CL;
DX可以分为DH和DL;
物理地址
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。
我们将这个唯一的地址称为物理地址。
概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
1、运算器一次最多可以处理16位的数据。
2、寄存器的最大宽度为16位。
3、寄存器和运算器之间的通路是16位的。
8086CPU给出物理地址的方法:
- 8086有20位地址总线,可传送20位地址,寻址能力为1M。
- 8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
地址加法器合成物理地址的方法:
物理地址=段地址*16+偏移地址



段的概念



段寄存器

- CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
- CS为代码段寄存器
- IP为指令指针寄存器







debug(调试)实验一
DOSBOX使用



查找范围
-d fff0:0 ff //空格是范围的意思,这样意味着查找范围为fff00到fffff
DS和[address]







注:段寄存器不存在算数指令


mov ax,1000:0 错误
CS和DS的区别

栈


栈空情况

push pop




第一个程序




ends是段的结束 end是程序结束



DOS的程序执行


用DOSBOX运行asm
首先在DOSBox 0.74 Options中写下如下代码进行挂载
1 | mount d d:\dos |
记得在d盘创建文件夹dos,然后将下载的masm文件转移到dos文件夹中,最后在dos文件夹中创建新的的文件夹asm进行存放asm文件
关于编译和链接




PE文件结构


PE相关名词


OD使用


快捷键

按;写注释
Alt+B打开断点编辑器,可删除已设置断点
加载目标文件调试



API从文本框获取字符串函数
GetDlgItemTextA/W
GetWindowTextA/W
汇编里任何函数都存在于eax中

调试技巧总结



关于寄存器 (32bit)

关于call指令


关于cmp指令

标志位

逻辑运算

关于test

条件跳转指令总结

补丁

认识OD的两种断点



推荐教程
OllyDBG完美教程(超强入门级) - xueyoo - 博客园 (cnblogs.com)
dec指令
DEC( DECrement ) 减1指令
格式:DEC OPR //Byte/Word
执行操作:(OPR)
指令使操作数的内容减1,然后再送回该操作数。
该操作数可以是寄存器操作数、存储器操作数。
例如:一、dec自减函数
1.dec(i,n);//i,n:integer;n为自减量
相当于i:=i-n;
2.dec(i);//i:integer;
相当于i:=i-1;
例如:二、Dec是递减函数
i:=100;
dec(i);
i就变成99了,
如果是dec(i,30)的话,
那么i=100-30=70
test指令
TEST AX,BX 与AND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中。

