当前位置:文档之家› 汇编基础教程

汇编基础教程

汇编基础教程
汇编基础教程

第1章基础知识

1.1 机器语言 1. 9 数据总线

1.2 汇编语言的产生 1.10 控制总线

1.3 汇编语言的组成 1.11 内存地址空间(概述)

1.4 存储器 1.12 主板

1.5 指令和数据 1.13 接口卡

1.6 存储单元 1.14 各类存储器芯片

1.7 CPU对存储器的读写 1.15 内存地址空间

1.8 地址总线

汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。

在本章中,对硬件系统结构的问题进行一部分的探讨,以使后续的课程可在一个好的基础上进行。

当课程进行到需要补充新的基础知识(关于编程结构或其他的)时候,再对相关的基础知识进行介绍和探讨。

本书的原则是,以后用到的知识,以后再说。

汇编课程的研究重点放在如何利用硬件系统的编程结构和指令集有效灵活的控制系统进行工作。

机器语言是机器指令的集合。

机器指令展开来讲就是一台机器可以正确执行的命令。

机器语言是机器指令的集合。

机器指令展开来讲就是一台机器可以正确执行的命令。

指令:01010000 (PUSH AX)

电平脉冲:

以后我们提到的计算机是指由CPU 和其他受CPU 直接或间接控制的芯片、器件、设备组成的计算机系统;

比如我们最常见的PC 机。

程序员们将0、1 数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程

序通过纸带机或卡片机输入计算机,进行运算。

示例

应用8086CPU完成运算:

S = 768 + 12288 – 1280

S = 768 + 12288 - 1280

机器码:

101100000000000000000011

000001010000000000110000

001011010000000000000101

假如将程序错写成以下这样,请找处错误:

101100000000000000000011

000001010000000000110000

000101101000000000000101

在显示器上输出“welcome to masm”。

机器码

看到这样的程序,你会有什么感想?

如果程序里有一个“ 1 ”被误写为“ 0 ”,又如何去查找呢?

汇编语言的主体是汇编指令。

汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

汇编指令是机器指令的助记符。

机器指令:1000100111011000

操作:寄存器BX的内容送到AX中

汇编指令:MOV AX,BX

这样的写法与人类语言接近,便于阅读和记忆。

寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。

AX是其中一个寄存器的代号,

BX是另一个寄存器的代号。

更详细的内容我们在以后的课程中将会讲到。

计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?

汇编语言由以下3类组成:

1、汇编指令(机器码的助记符)

2、伪指令(由编译器执行)

3、其它符号(由编译器识别)

汇编语言的核心是汇编指令,它决定了汇编语言的特性。

CPU 是计算机的核心部件.它控制整个计算机的运作并进行运算,要想让一个CPU 工作,就必须向它提供指令和数据。

指令和数据在存储器中存放,也就是平时所说的内存。

在一台PC机中内存的作用仅次于CPU。

离开了内存,性能再好的CPU也无法工作。

磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU 使用。

二进制信息:

1000100111011000

─> 89D8H (数据)

1000100111011000

─> MOV AX,BX (程序)

存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号;

例如:

一个存储器有128个存储单元,

编号从0~127。

如右图示:

对于大容量的存储器一般还用以下单位来计量容量(以下用B来代表Byte):1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

磁盘的容量单位同内存的一样,实际上以上单位是微机中常用的计量单位。

CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互:存储单元的地址(地址信息)

器件的选择,读或写命令(控制信息)

读或写的数据(数据信息)

在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。

物理上:一根根导线的集合;

逻辑上划分为:

地址总线

数据总线

控制总线

图示

CPU在内存中读或写的数据演示:

读演示

写演示

从上面我们知道CPU是如何进行数据读写的。可是我们如何命令计算机进行数据的读写呢?

对于8086CPU,下面的机器码能够完成从3号单元读数据:

机器码:101000000000001100000000

含义:从3号单元读取数据送入寄存器AX

CPU接收这条机器码后将完成上面所述的读写工作。

机器码难于记忆,用汇编指令来表示,情况如下:

机器码:101000000000001100000000

对应的汇编指令:MOV AX,[3]

?含义:传送CPU是通过地址总线来指定存储单元的。

?地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。

3号单元的内容到AX

?地址总线发送地址信息演示

?一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。

?这样的CPU最多可以寻找2的N次方个内存单元。

?CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。

?数据总线的宽度决定了CPU和外界的数据传送速度。

?我们来分别看一下它们向内存中写入数据89D8H时,是如何通过数据总线传送数据

的:

?8088CPU数据总线上的数据传送情况

?8086CPU数据总线上的数据传送情况

?CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制

总线是一些不同控制线的集合。

?有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。

所以,控制总线的宽度决定了CPU对外部器件的控制能力。

?控制总线上发送的控制信息

?前面所讲的内存读或写命令是由几根控制线综合发出的:

?其中有一根名为读信号输出控制线负责由CPU 向外传送读信号,CPU 向该

控制线上输出低电平表示将要读取数据;

?有一根名为写信号输出控制线负责由CPU向外传送写信号。

?(1)汇编指令是机器指令的助记符,同机器指令一一对应。

?(2)每一种CPU都有自己的汇编指令集。

?(3)CPU可以直接使用的信息在存储器中存放。

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

?(5)存储单元从零开始顺序编号。

?(6)一个存储单元可以存储8 个bit (用作单位写成“b”),即8 位二进制数。

?(7)1B = 8b 1KB = 1024B

1MB = 1024KB 1GB = 1024MB

?(8)每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚

引出总线。一个CPU可以引出三种总线的宽度标志了这个CPU的不同方面的性能:

?地址总线的宽度决定了CPU的寻址能力;

?数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送

量;

?控制总线宽度决定了CPU对系统中其它器件的控制能力。

?在汇编课程中,我们从功能的角度介绍了这三类总线,对实际的连接情况不做讨论。

?特别提示

?什么是内存地址空间呢?

?一个CPU的地址线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到

的内存单元就构成这个CPU的内存地址空间。下面深入讨论。

?首先需要介绍两部分基本知识,主板和接口卡。

?在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件。

?这些器件通过总线(地址总线、数据总线、控制总线)相连。

?计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。

?CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进

行工作的是插在扩展插槽上的接口卡。

?从读写属性上看分为两类:

随机存储器(RAM)和只读存储器(ROM)

?从功能和连接上分类:

?随机存储器RAM

?装有BIOS的ROM

?接口卡上的RAM

?PC机中各类存储器的逻辑连接情况

?装有BIOS的ROM

BIOS:Basic Input/Output System,基本输入输出系统。

BIOS是由主板和各类接口卡(如:显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM。

?上述的那些存储器在物理上是独立的器件。

?但是它们在以下两点上相同:

1、都和CPU的总线相连。

2、CPU对它们进行读或写的时候都通过控制线发出内存读写命令。

?将各各类存储器看作一个逻辑存储器:

?所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;

?每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;

?CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读

写数据。

?假设,上图中的内存空间地址段分配如下:

?地址0~7FFFH的32KB空间为主随机存储器的地址空间;

?地址8000H~9FFFH的8KB空间为显存地址空间;

?地址A000H~FFFFH的24KB空间为各个ROM的地址空间。

?不同的计算机系统的内存地址空间分配情况是不同的。

?8086PC机内存地址空间分配的基本情况

?内存地址空间:

?最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑

问题。

?对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存

储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说

的内存地址空间。

第2章寄存器(CPU工作原理)

? 2.1 通用寄存器

? 2.2 字在寄存器中的存储

? 2.3 几条汇编指令

? 2.4 物理地址

? 2.5 16位结构的CPU

? 2.6 8086CPU给出物理地址的方法

? 2.7 “段地址×16+偏移地址

=物理地址”的本质含义

? 2.8 段的概念

? 2.9 段寄存器

? 2.10 CS和IP

? 2.12 代码段

?一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

?内部总线实现CPU内部各个器件之间的联系。

?外部总线实现CPU和主板上其它器件的联系。

?8086CPU有14个寄存器它们的名称为:

AX、BX、CX、DX、SI、DI、SP、BP、

IP、CS、SS、DS、ES、PSW。

?这些寄存器以后会陆续介绍

?8086CPU所有的寄存器都是16位的,可以存放两个字节。

?AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。

?下面以AX为例,我们看一下寄存器的逻辑结构。

?一个16位寄存器可以存储一个16位的数据。(数据的存放情况)

?一个16位寄存器所能存储的数据的最大值为多少?

答案:216-1。

?数据:18

?二进制表示:10010

?在寄存器AX中的存储:

?数据:20000

?二进制表示:0100111000100000

?在寄存器AX中的存储:

?数据:18

?二进制表示:10010

?在寄存器AX中的存储:

?数据:20000

?二进制表示:0100111000100000

?在寄存器AX中的存储:

?8086上一代CPU中的寄存器都是8位的;

?为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

?AX可以分为AH和AL;

?BX可以分为BH和BL;

?CX可以分为CH和CL;

?DX可以分为DH和DL。

?8086CPU的8位寄存器存储逻辑

?以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况:

?AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄

存器。

?AH和AL寄存器是可以独立使用的8位寄存器。

?8086CPU的8位寄存器数据存储情况

?一个8位寄存器所能存储的数据的最大值是多少?

答案:28-1。

?一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个

寄存器的高8位寄存器和低8位寄存器中。

?由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放n 个8位数据。

也就是说,计算机中的数据大多

是由1~N个8位数据构成的。

?用十六进制来表示数据可以直观的看

出这个数据是由哪些8位数据构成的。

?示例

?CPU执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变。

?这里的丢失,指的是进位制不能在8 位寄存器中保存,但是CPU 不是并真的不丢

弃这个进位值,这个问题会在后面的课程中讨论。

?CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一

个一维的线性空间。

每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。

?概括的讲,16位结构描述了一个CPU具有以下几个方面特征:

?1、运算器一次最多可以处理16位的数据。

?2、寄存器的最大宽度为16位。

?3、寄存器和运算器之间的通路是16位的。

?8086有20位地址总线,可传送20位地址,寻址能力为1M。

?8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

?8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

?8086CPU相关部件的逻辑结构

?地址加法器合成物理地址的方法:

物理地址=段地址×16+偏移地址

?例如:

8086CPU访问地址为123C8H的内存单元

由段地址×16引发的讨论

?观察移位次数和各种形式数据的关系:

?(1)一个数据的二进制形式左移1位,相当于该数据乘以2;

?(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;

?(3)地址加法器如何完成段地址×16的运算?

以二进制形式存放的段地址左移4位。

?两个比喻说明:

?说明“基础地址+偏移地址= 物理地址” 的思想:第一个比喻

?说明“段地址×16+偏移地址=物理地址”的思想:第二个比喻

8086CPU就是这样一个只能提供两张3位数据纸条的CPU。

?比如说,学校、体育馆同在一条笔直的单行路上(学校位于路的起点0米处)。

?读者在学校,要去图书馆,问我那里的地址,我可以用几种方式描述这个地址?

?比如我们只能通过纸条来通信,读者问我图书馆的地址,我只能将它写在纸上告诉

读者。

?显然我必须有一张可以容纳 4 位数据的纸条才能写下2826这个数据:

?不巧的是,没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。

?这样我只能以这种方式告诉读者2826这个数据:

?错误认识:

?内存被划分成了一个一个的段,每一个段有一个段地址。

?其实:

?内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)

+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分

段的方式来管理内存。

?我们可以认为:地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基

础地址)为10000H,段地址为1000H,大小为100H。

?我们也可以认为地址10000H~1007FH、10080H~100FFH 的内存单元组成两个段,

它们的起始地址(基础地址)为10000H和10080H,段地址为:1000H 和1008H,大小都为80H。

?以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址

×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

?两点需要注意

?内存单元地址小结

?特别提示

?(1)段地址×16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;

?(2)偏移地址为16位,16 位地址的寻址能力为64K,所以一个段的长度最大为

64K。

?CPU访问内存单元时,必须向内存提供内存单元的物理地址。

?8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。

?思考两个问题

?(1)观察下面的地址,读者有什么发现?

?

?结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址。

?

?(2)如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内

存单元?

?结论:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可

寻64K个内存单元。

?比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:

10000H~1FFFFH。

?在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。

?“数据在21F60H内存单元中。”对于8086PC机的两种描述:

?(a)数据存在内存2000:1F60单元中;

?(b)数据存在内存的2000段中的1F60H单元中。

?可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

2.9 段寄存器

?段寄存器就是提供段地址的。

8086CPU有4个段寄存器:

CS、DS、SS、ES

?当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

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

CS为代码段寄存器;

IP为指令指针寄存器。

?8086PC读取和执行指令演示

?8086PC工作过程的简要描述

?(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

?(2)IP = IP + 所读取指令的长度,从而指向下一条指令;

?(3)执行指令。转到步骤(1),重复这个过程。

?在8086CPU 加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为

CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读

取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

?内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息

看作指令,有的信息看作数据。

?CPU根据什么将内存中的信息看作指令?

CPU将CS:IP指向的内存单元中的内容看作指令。

?在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成

指令的物理地址,到内存中读取指令码,执行。

?如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被

CS:IP指向过。

?在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器

中的内容实现对CPU的控制。

?CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中

的内容来控制CPU执行目标指令。

?我们如何改变CS、IP的值呢?

?8086CPU必须提供相应的指令

?先回想我们如何修改AX中的值?

?mov指令不能用于设置CS、IP的值,

8086CPU没有提供这样的功能。

?8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令

?mov 指令

?如:mov ax,123

?mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。

?能够通过mov 指令改变CS、IP的值吗?

?同时修改CS、IP的内容:

jmp 段地址:偏移地址

jmp 2AE3:3

jmp 3:0B16

功能:用指令中给出的段地址修改CS,偏移地址修改IP。

?仅修改IP的内容:

jmp 某一合法寄存器

jmp ax (类似于mov IP,ax)

jmp bx

功能:用寄存器中的值修改IP。

?内存中存放的机器码和对应汇编指令情况:(初始:CS=2000H,IP=0000H)

请写出指令执行序列:

?(1)mov ax,6622

?(2)jmp 1000:3

?(3)mov ax,0000

?(4)mov bx,ax

?(5)jmp bx

?(6)mov ax,0123H

?(7)转到第(3)步执行

?对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.doczj.com/doc/f216968586.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

ARM经典汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A MOV R7,#0AH CLR 00H MOV A,@R0 Q12:INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,Q13 SETB C Q13:MOV A,R2 JC Q11 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 Q11:MOV A,@R0 DJNZ R7,Q12 JB 00H,QUE1 SJMP $ END

2 ARM汇编希尔排序法对10个带符号数进行排序Code: void shell(int src[],int l,int r){ int ih; r++; for(ih=1;ih<(r-l)/9;ih=ih*3+1); //eax,ih //ebx,il //ecx,ir //edx,cmps _asm{ push eax push ebx push ecx push edx push esi push edi;貌似这堆进栈用处不大哎 mov edi,src mov eax,dword ptr [ih] LIH: cmp eax,0 jna EXIH mov ebx,eax dec ebx LLH: cmp ebx,dword ptr [r] jnb EXLLH mov ecx,ebx mov edx,dword ptr [edi+ecx*4]

LCMP: mov esi,eax dec esi cmp ecx,esi jna EXCMP push ecx sub ecx,eax cmp edx,dword ptr [edi+ecx*4] pop ecx jnb EXCMP push ebx push ecx sub ecx,eax mov ebx,dword ptr [edi+ecx*4] pop ecx mov dword ptr [edi+ecx*4],ebx pop ebx sub ecx,eax jmp LCMP EXCMP: mov dword ptr [edi+ecx*4],edx inc ebx jmp LLH EXLLH: push ecx mov ecx,3 push edx cdq

IAR -arm 入门教程

IAR 使用说明 关于文档(初版): 1.主要是为了给IAR的绝对新手作参考用 2.emot制件,由Zigbee & IAR 学习小组保持修订权 3.希望用IAR朋友能将它修订完善 4.任何人可无偿转载、传播本文档,无须申请许可,但请保留文档来源及标志 5.如无重大升级,请沿用主版本号 版本 版本号制作时间制定人/修改人说明 1.00 2008/7/27 emot 初版(仅供新手参考) 1.01 2010/8/19 Emot 增加 下载程序(第四章) 在线调试程序(第五章) 序: 其实IAR和keil区别也没有多大,不过很多人就是怕(当初我也怕)。怕什么呢,怕学会了,真的就是害怕学习的心理让新手觉得IAR是个不好用的或者说“还不会用的”一个工具吧。我也是一个刚毕业的小子,如果说得不妥,还请大家来点砖头,好让小组筑高起来。(Zigbee & IAR 学习小组地址是https://www.doczj.com/doc/f216968586.html,/673) 初版我将会说明以下3个问题,IAR的安装、第一个IAR工程的建立和工作编译。这是我写的第一个使用说明,不足的以后补充吧。 一、IAR软件安装图解 1.打开IAR软件安装包进入安装界面 打开软件开发包

软件安装界面 2.按照提示步骤执行,一直到授权页面,输入序列号,IAR中有两层序列号,所以要输入两 组序列号。 输入第一组序列号

3.选择安装路径(最好默认,不默认也不影响使用) 路径选择页面

修改路径4.选择全部安装(Full) 选择全部安装5.按提示知道安装完成。

安装完成页面 二、新建第一个IAR工程 用IAR首先要新建的是工作区,而不是工程。在工作区里再建立工程,一个工作区里似乎也不能建多个工程(我试过,但没成功,不知道IAR里提出workspace的概念是为什么?)要不打IAR的help来看,说清楚也是头痛的事,先知道有要在工作空间里建工程就对了。新建IAR工作空间,首先是菜单File里选择Open再选择Workspace,为方便说明再遇到菜 单我就直接说成File-Open-Workspace这样了。看了下面图上的红圈就知道是怎么回事了。 接着就会看到一片空白。这时就是新的“办公区”了。

Linux基本反汇编结构与GDB入门

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、基本操作指令 简单的操作数类型说明,一般有三种, (1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。 (2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。 (3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。 图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元

注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。从上面的图我们就可以大致了解操作数的类型了。 在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。 1、movl $0x4050, %eax 立即数——寄存器 2、movl %ebp, %esp 寄存器——寄存器 3、movl (%edi, %ecx), %eax 存储器——寄存器 4、movl $-17, (%esp) 立即数——存储器 5、movl %eax, -12(%ebp) 寄存器——存储器 注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的, 结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大, 如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,studyrush@studyrush-desktop:~/C$ vi exchange.c vi 后面加我们要创建的程序文件的名字,在这里是exchange.c studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。 studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示运行程序,下面是运行的结果。 a = 3, b = 4

汇编语言-王爽-完美高清版视频教程

汇编语言》-王爽-完美高清版-零基础汇编语言入门书籍PDF格式 同时按ctrl+要下载的地址既可下载对应的视频 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f61cb107c8 001第一章- 基础知识01 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6806f45b8 002第一章- 基础知识02 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6ec42d4d3 003第一章- 基础知识03 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6deb05ec4 004第一章-基础知识04 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6e51f6838 005第一章- 基础知识05 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f66edaf8d3 006第二章- 寄存器(CPU工作原理)01 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6d07e07b9 007第二章- 寄存器(CPU工作原理)02 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6d7f585a8 008第二章- 寄存器(CPU工作原理)03 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f639d8b3cf 009第二章- 寄存器(CPU工作原理)04 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6dcadbde6 010第二章- 寄存器(CPU工作原理)05 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6ea3f01c1 011第二章- 寄存器(CPU工作原理)06 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f65b96a06f 012第二章- 寄存器(CPU工作原理)07 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f682da085a 013第三章- 寄存器(内存访问)01 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6486e698 014第三章- 寄存器(内存访问)02 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6b7491d9f 015第三章- 寄存器(内存访问)03 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f622b7f9a7 016第三章- 寄存器(内存访问)04 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f64e2424b9 017第三章- 寄存器(内存访问)05 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6e5132d4d 018第三章- 寄存器(内存访问)06 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f655c10e86 019第三章- 寄存器(内存访问)07 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6b22e64e6 020第四章- 第一个程序01 下载地址:https://www.doczj.com/doc/f216968586.html,/file/f6812126a4

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

Windows X86-64位汇编语言入门

Windows X86-64位汇编语言入门 Windows X64汇编入门(1) 最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。 文章的标题包含了本文的四方面主要内容: (1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista 64位版,调用的均为windows API。 (2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。至于三者间的区别,可自行搜索。 (3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。 (4)入门:既是入门,便不会很全。其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。其二,便于类似我这样刚接触x64汇编的新手入门。 本文所有代码的调试环境:Windows Vista x64,Intel Core 2 Duo。 1. 建立开发环境 1.1 编译器的选择 对应于不同的x64汇编工具,开发环境也有所不同。最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio 2005一起发布。因此,如果你是微软的忠实fans,直接安装VS2005既可。运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC 资源编译器,且自带了Include目录。它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。因此,本文的代码就在GoASM下编译。 第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。 不同的编译器,语法会有一定差别,这在下面再说。 1.2 IDE的选择 搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。因此,最简单的方法是自行修改EditPlus的masm语法文件,这也是我采用的方法,至少可以得到语法高亮。当然,如果你懒得动手,那就用notepad吧。 没有IDE,每次编译时都要手动输入不少参数和选项,做个批处理就行了。 1.3 硬件与操作系统 硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了

OllyDBG完美教程

关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编 一、OllyDBG 的安装与配置 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可: OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助: 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签: 因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个 UDD 目录

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

汇编经典代码

1.顺序程序设计 将两个多位十进制数相加,要求被加数、加数均以ASCⅡ码形式各自顺序存放在以DATA1和DATA2为首的五个内存单元中(低位在前),结果送回DATA1处。 DATA SEGMENT DATA1 DB 34H,35H,39H,38H,36H,' ' ;被加数 DATA2 DB 37H,34H,33H,36H,32H,' ' ;加数 DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,DATA1 ;有效地址送SI,为调用显示子程序做准备 CALL DISPLAY ;调用显示子程序 CALL CRLF ;调用回车换行子程序 LEA SI,DATA2 ;有效地址送SI,为调用显示子程序做准备,同时为加法运算做准备 CALL DISPLAY ;调用显示子程序 CALL CRLF ;调用回车换行子程序 LEA DI,DATA1 ;有效抵制送DI,为加法运算做准备 MOV AX,0 MOV BX,0 MOV CL,05H ;记录循环次数 ADDS: MOV AL,[SI] ;将加数送往AL SUB AL,30H ADD AL,BL ;加上进位 MOV BL,[DI] ;将被加数送往BL SUB BL,30H ADD AL,BL ;加法运算 ADD AL,30H CMP AL,3AH JA SUBA ;结果>=10,跳到SUBA JB NSUBA SUBA: SUB AL,0AH ;减去10的值,并置BL为1 MOV BL,01H JMP CONTINUE NSUBA: MOV BL,00H ;置BL为0 CONTINUE:MOV [DI],AL ;将相加的结果从AL送往DI的地址,即DATA1的地址INC DI ;地址加1 INC SI ;地址加1 LOOP ADDS ;循环 JC SHUCHU JNC SHUCHU2 SHUCHU2: MOV AL,31H ;CF为1设置结果最高位为1 JMP CONTINUE2 SHUCHU:MOV AL,30H ;CF为0设置结果最高位为0

相关主题
文本预览
相关文档 最新文档