基础知识

  • 汇编指令是机器指令的助记符,同机器指令一一对应。

  • 每一种CPU都有自己的汇编指令集

  • CPU可以直接使用的信息在存储器中存放

  • 在存储器中指令和数据没有任何区别,都是二进制信息

  • 存储单元从0开始顺序编号

  • 一个存储单元可以存储8个bit,即8位二进制数

  • 每个CPU芯片都有许多管脚,这些管脚和总线项链。也可以说,这些管脚引出总线。一个CPU可以引出三种总线的宽度标志了这个CPU的不同方面的性能

  • {

    地址总线的宽度决定了CPU的寻址能力
    
    数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量
    
    控制总线的宽度决定了CPU对系统中其它器件的控制能力
    
  • }

    image-20220215005559049

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(高八位,815)和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+偏移地址

    image-20220216112129197

![image-20220216112536606](浅学汇编/image-20220216112536606.png)

image-20220216112922685

段的概念

image-20220216113202673

image-20220216120730189

image-20220216120935933


段寄存器

image-20220217125626469

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

image-20220217130119147

image-20220217130137693

image-20220217130339907

image-20220217130519596

image-20220217130702554

image-20220217132311940

image-20220217132831840


debug(调试)实验一

DOSBOX使用

image-20220223204951416

image-20220217141025568

image-20220217142231088

查找范围

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

DS和[address]

image-20220218005429122

image-20220218005402523

image-20220218121459381

image-20220218121842326

image-20220218121902420

image-20220222105740399

image-20220222105839205

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

image-20220222111010558

image-20220222111441256

mov ax,1000:0 错误

CS和DS的区别

image-20220222111843139

image-20220222115433876

image-20220222115711701

栈空情况

image-20220222120943700

push pop

image-20220222141459835

image-20220222192523107

image-20220222193620528

image-20220223091436914

第一个程序

image-20220223175752819

image-20220223185144841

image-20220223185410419

image-20220223185511521

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

image-20220223185742689

image-20220223185834393

image-20220223191150330

DOS的程序执行

image-20220223191520074

image-20220223200804968

用DOSBOX运行asm

首先在DOSBox 0.74 Options中写下如下代码进行挂载

1
2
3
4
mount d d:\dos
path=%path%;\masm
d:
cd \asm

记得在d盘创建文件夹dos,然后将下载的masm文件转移到dos文件夹中,最后在dos文件夹中创建新的的文件夹asm进行存放asm文件

关于编译和链接

image-20220224005448805

image-20220224005501602

image-20220224113814453

image-20220224115108723

PE文件结构

image-20220224125318135

image-20220225133950125

PE相关名词

image-20220224125759452

image-20220224125944570

OD使用

image-20220224133544753

image-20220224133548537

快捷键

image-20220224133615605

按;写注释

Alt+B打开断点编辑器,可删除已设置断点

加载目标文件调试

image-20220224203455047

image-20220224203618639

image-20220224204751414

API从文本框获取字符串函数

GetDlgItemTextA/W

GetWindowTextA/W

汇编里任何函数都存在于eax中

image-20220224223453461

调试技巧总结

image-20220224221109576

image-20220224221204348

image-20220224221839813

关于寄存器 (32bit)

image-20220224222700870

关于call指令

image-20220224223246461

image-20220224223632835

关于cmp指令

image-20220224223926633

标志位

image-20220224224059742

逻辑运算

image-20220224224232452

关于test

image-20220224225647856

条件跳转指令总结

image-20220224225827575

补丁

image-20220224232853607

认识OD的两种断点

image-20220301002813510

image-20220301002930741

image-20220301003028017

推荐教程

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,BXAND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中。