当前位置:文档之家› arm反汇编.

arm反汇编.

arm反汇编.
arm反汇编.

在bin文件中,就是一条条的机器指令,每条指令4个字节。

在ADS中打开一个.s文件,选择project->disassemble

可以看到汇编的机器码

汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\armex.s):

AREA ARMex, CODE, READONL Y ; name this block of code

ENTRY ; mark first instruction

; to execute

start

MOV r0, #10 ; Set up parameters

MOV r1, #3

ADD r0, r0, r1 ; r0 = r0 + r1

stop

MOV r0, #0x18 ; angel_SWIreason_ReportException

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

SWI 0x123456 ; ARM semihosting SWI

END ; Mark end of file

执行project->disassemble后:

** Section #1 'ARMex' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT] Size : 28 bytes (alignment 4)

start

$a

ARMex

0x00000000: e3a0000a .... MOV r0,#0xa

0x00000004: e3a01003 .... MOV r1,#3

0x00000008: e0800001 .... ADD r0,r0,r1

stop

0x0000000c: e3a00018 .... MOV r0,#0x18

0x00000010: e59f1000 .... LDR r1,0x18

0x00000014: ef123456 V4.. SWI 0x123456

$d

0x00000018: 00020026 &... DCD 131110

使用UltraEdit看bin文件如下:

可以看到,与上面的一样。

其中MOV的机器码如下(ARM体系结构pdf:p156):

cond,AL(Always)为0b1110

最后有一个131110不知道是什么意思。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 另一个例子汇编代码如下(ADS中的一个例程\ARM\ADSv1_2\Examples\asm\ subrout.s):

AREA subrout, CODE, READONL Y ; name this block of code

ENTRY ; mark first instruction

; to execute

start

MOV r0, #10 ; Set up parameters

MOV r1, #3

BL doadd ; Call subroutine

stop

MOV r0, #0x18 ; angel_SWIreason_ReportException

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

SWI 0x123456 ; ARM semihosting SWI

doadd

ADD r0, r0, r1 ; Subroutine code

MOV pc, lr ; Return from subroutine.

END ; Mark end of file

执行project->disassemble后:

** Section #1 'subrout' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ENTRYSECT] Size : 36 bytes (alignment 4)

start

$a

subrout

0x00000000: e3a0000a .... MOV r0,#0xa

0x00000004: e3a01003 .... MOV r1,#3

0x00000008: ebfffffe .... BL doadd ; 0x18

stop

0x0000000c: e3a00018 .... MOV r0,#0x18

0x00000010: e59f1008 .... LDR r1,0x20

0x00000014: ef123456 V4.. SWI 0x123456

doadd

0x00000018: e0800001 .... ADD r0,r0,r1

0x0000001c: e1a0f00e .... MOV pc,r14

$d

0x00000020: 00020026 &... DCD 131110

使用UltraEdit看bin文件如下:

不知道为什么,ADS里面的BL doadd的机器码和bin中的机器码不一样。

BL的机器指令如下:

0x00000008: ebfffffe .... BL doadd ; 0x18

按bin中的机器码,EB000002,1110_1101_0000_0000____0000_0000_0000_0010

会在执行bl指令时的PC后面加上2*4byte,正好跳过3条指令。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下面这个例子将doadd写到另一个.s文件中。

subrout.s文件:

AREA subrout, CODE, READONL Y ; name this block of code

ENTRY ; mark first instruction

; to execute

IMPORT doadd ; import

start

MOV r0, #10 ; Set up parameters

MOV r1, #3

BL doadd ; Call subroutine

stop

MOV r0, #0x18 ; angel_SWIreason_ReportException

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

SWI 0x123456 ; ARM semihosting SWI

END ; Mark end of file

fun.s文件:

AREA subrout, CODE, READONL Y ; name this block of code

EXPORT doadd

doadd FUNCTION

ADD r0, r0, r1 ; Subroutine code

MOV pc, lr ; Return from subroutine.

ENDFUNC

LTORG

END

UE查看bin结果:

可以看出,跳转指令变为跳转3个指令,doadd函数放在了bin的最后。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 这个例子将上面的subrout.s文件改为(工程subroutprj_2F_DCD):

AREA subrout, CODE, READONL Y ; name this block of code

ENTRY ; mark first instruction

; to execute

IMPORT doadd ; import

start

LDR r0, Param1 ; Set up parameters

LDR r1, Param2

BL doadd ; Call subroutine

stop

MOV r0, #0x18 ; angel_SWIreason_ReportException

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit

SWI 0x123456 ; ARM semihosting SWI

Param1 DCD 10

Param2 DCD 3

END ; Mark end of file

MOV只能操作reg和立即数

操作内存,MOV要改为LDR

UE查看bin为:

LDR r0, Param1的机器码为:

E59F0010=0111_0101_1001_1111_0000_0000_0001_0000

Rn为R15=PC,Rd=R0,address=16(4*Instruction)+PC

输出的Image Symbol Table为:

================================================================================

Image Symbol Table

Mapping Symbols

Sym Value Execution Region

$a 0x00000000 ER_RO

$d 0x00000020 ER_RO

其中$a表示ARM Code,$d表示Data

这是整个bin文件的区域分配,从0开始为ARM Code,然后从20开始为Data,其中ARM Code是fun section 和subrout section合在一起的,Data也是两个数据合在一起的(似乎是armlink把input section中同一属性的段合并到output section中)。

ADS中输出调试信息

Image Map

Symbol

Section cross-reference

在list file中choose一个文件,比如boot270.txt,可以把信息输出到txt中

下面这个输出是subroutprj_2F_DCD的输出,在arm反汇编.doc里。

================================================================================

Image Symbol Table

Mapping Symbols

Sym Value Execution Region

$a 0x00000000 ER_RO

$d 0x00000020 ER_RO

Local Symbols

Symbol Name Value Ov Type Size Object(Section)

E:\dsparm\pxa270\project\subroutprj_2F_DCD\subrout.s 0x00000000 Number 0 subrout.o ABSOLUTE

0x00000000 Data 16 subrout.o(.debug_abbrev) 0x00000000 Data 128 subrout.o(.debug_info) 0x00000000 Data 108 subrout.o(.debug_line) subrout0x00000008 ARM Code 36 subrout.o(subrout)

start0x00000008 ARM Code 0 subrout.o(subrout)

stop0x00000014 ARM Code 0 subrout.o(subrout)

Param10x00000020 Data 4 subrout.o(subrout)

Param20x00000024 Data 4 subrout.o(subrout)

E:\dsparm\pxa270\project\subroutprj_2F_DCD\fun.s 0x00000000 Number 0 fun.o ABSOLUTE

0x00000000 Data 60 fun.o(.debug_frame) 0x00000010 Data 16 fun.o(.debug_abbrev) fun0x00000000 ARM Code 8 fun.o(fun)

0x0000006c Data 96 fun.o(.debug_line)

0x00000080 Data 124 fun.o(.debug_info)

Global Symbols

Symbol Name Value Ov Type Size Object(Section)

BuildAttributes$$ARM_ISAv4$M$PE$A:L22$X:L11$S22$~IW$~STKCKD$~SHL$OSPACE 0x00000000 Number 0 anon$$obj.o ABSOLUTE

doadd0x00000000 ARM Code 8 fun.o(fun)

UE查看bin结果

从bin看到,doadd两条指令放在了bin的最前面,这样

start的值value为0x00000008

fun的值value为0x00000000

start和fun都是ARM Code,是代码的标号label,标号的值代表一个地址,所以start和fun在bin 中的地址即为它们的值。

Image Symbol Table中包含两部分,Local Symbol和Global Symbol,前者在只能在定义的文件中引用,后者可以在整个工程中引用。在这个工程中后者只有doadd函数。

========================================================================

Memory Map of the image

Image Entry point : 0x00000000

Load Region LR_1 (Base: 0x00000000, Size: 0x0000002c, Max: 0xffffffff, ABSOLUTE)

Execution Region ER_RO (Base: 0x00000000, Size: 0x0000002c, Max: 0xffffffff, ABSOLUTE)

Base Addr Size Type Attr Idx E Section Name Object

0x00000000 0x00000008 Code RO 5 * fun fun.o

0x00000008 0x00000024 Code RO 1 * subrout subrout.o

Execution Region ER_RW (Base: 0x0000002c, Size: 0x00000000, Max: 0xffffffff, ABSOLUTE)

**** No section assigned to this execution region ****

Execution Region ER_ZI (Base: 0x0000002c, Size: 0x00000000, Max: 0xffffffff, ABSOLUTE)

**** No section assigned to this execution region ****

Image Entry point : 0x00000000这句话有点问题??!!

Base Addr Size Type Attr Idx E Section Name Object

0x00000000 0x00000008 Code RO 5 * fun fun.o

0x00000008 0x00000024 Code RO 1 * subrout subrout.o

上面这些说明了各段的基地址,长度,类型(code,data),属性(RO,RW),段名,存在的目标文件。

在这里fun放在了subrout的前面,由于armlinker在链接input section的时候排序sort是有规则的,先同一属性(RO,RW,RI),然后按名字的字母表顺序。由于fun和subrout都是RO,所以按名字fun在前面。

-----------------------------------------------------------------

下面以boot270工程为例子分析:

输出的Image Symbol Table

Global Symbols

Symbol Name Value Ov Type Size Object(Section)

xlli_read_SCR 0xa000cea0 ARM Code 420 xlli_LowLev_Init.o(text)

可以看出xlli_read_SCR为ARM Code,是一个标号label,值即为其在bin中的地址,由于设置RO Base为0xA0000000,所以在bin中找0x0000cea0处的指令:

指令为E59F_419C,即为

xlli_read_SCR FUNCTION

;

; Insure the RDH and PH bits on PXA27x must be clear to enable GPIO pins.

; They are sticky bits so they must be set to clear them.

;

ldr r4, =xlli_PMRCREGS_PHYSICAL_BASE

该指令表示(E表示AL,无条件,F为R15=PC,4表示放到R4里,地址为PC+19C=D03C,再加2*4为D044)

0x0000d044处的数据为40F00000,与代码中的数据吻合:

; POWER MANAGER base address and register offsets from the base address

;

xlli_PMRCREGS_PHYSICAL_BASE EQU 0x40F00000

这个数据在Image Symbol Table中也能找到,在Local Symbols中:

xlli_PMRCREGS_PHYSICAL_BASE 0x40f00000 Number 0 main_Flash.o ABSOLUTE

能看到是一个Number,值value为0x40f00000。

这个数据的地址在Image Symbol Table中也能看到:

Mapping Symbols

Sym Value Execution Region

$d 0xa000d044 ER_RO

$d表示数据data。

下一条指令:

; Get, and save the present GPIO settings for direction registers 0, 1 and 2

;

ldr r4, =xlli_GPIOREGS_PHYSICAL_BASE ; Get the GPIO registers base address

指令为:E5_9F_4_194

数据的地址为:PC+194+2*4=D048

数据为:40E0 0000,与代码中的定义对应:

; GENERAL PURPOSE I/O (GPIO) base address and register offsets from the base address

;

xlli_GPIOREGS_PHYSICAL_BASE EQU 0x40E00000

地址0x0000 D048在Image Symbol Table中没有,不过有:

Mapping Symbols

Sym Value Execution Region

$d 0xa000d044 ER_RO

说明从0xa000d044处开始为许多RO data

上面的工程只有RO,怎么才能产生RW,RI呢?MOV E3

LDR E5

ADD E0

试验二ARM汇编语言程序设计

实验二 ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程 2.掌握ARM汇编指令 二、实验设备 1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。 2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。 三、汇编语言简介 1.ARM汇编的一些简要的书写规范 ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。ARM汇编对标识符的大小写敏感,书写标号及指令时字母大 小写要一致。在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全 部小写,但不要大小写混合使用。注释使用“;”号,注释的内容由“;”号起到此 行结束,注释可以在一行的顶格书写。 详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。 2. ARM汇编语言程序的基本结构 在ARM汇编语言程序中,是以程序段为单位来组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段的和数据段,代码段的内容为执 行代码,数据段存放代码运行时所需的数据。一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形 成一个可执行文件。可执行映像文件通常由以下几部分构成: ◆ 一个或多个代码段,代码段为只读属性。 ◆ 零个或多个包含初始化数据的数据段,数据段的属性为可读写。 ◆ 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。 链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定 相同。 3. 简单的小例子 下面是一个代码段的小例子 AREA Init,CODE,READONLY ENTRY LDR R0, =0x3FF5000 LDR R1, 0x0f STR R1, [R0]

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用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. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

最全的脱壳,反编译 ,汇编工具集合

本文由nbdsb123456贡献 最全的脱壳,反编译,汇编工具集合 破解工具下载连接 1 调试工具 Ollydbg V1.10 正式汉化修改版+最新最全插件2.02m SmartCheck V6.20 20.54M Compuware SoftICE V4.3.1 精简版10.57M Compuware (SoftICE) Driver Studio V3.1 完全版176.52M TRW2000 V1.22 汉化修改版+全部最新插件1.47Mforwin9X 动态破解VB P-code程序的工具 WKTVBDebugger1.4e 2 反汇编工具 W32Dasm是一个静态反汇编工具,也是破解人常用的工具之一,它也被比作破解人的屠龙刀。 W32Dasm10.0修改版是经Killer在W32Dasm8.93基础上修改的,修改后的W32Dasm功能更强大,能完美显示中文字符串及VB程序,内含16进制编辑器,破解修改软件更容易,真可谓是反汇编极品! W32Dasm V10.0 汉化增强版419 KB 反汇编工具老大,功能大大的胜过了w32dasm。学习加解密的朋友不可错过。即使不用你也要收藏一份。:) IDA Pro Standard V4.60.785 零售版 + Flair + SDK33.08 MB C32Asm是集反汇编、16进制工具、Hiew修改功能与一体的新工具。强烈推荐! C32Asm V0.4.12 1.97 MB C32Asm V0.4.12 破解补丁 650 KB 3 反编译工具 Delphi DeDe3.50.04 Fix增强版5.3 MB 4 PE相关工具 PE编辑工具 Stud_PE1.8 PE工具,用来学习PE格式十分方便。 https://www.doczj.com/doc/2e12682649.html,/tools/PE_tools/Editor/stdupe/Stud_PE1.8.zip ProcDump32 v1.6.2 FINAL Windows下的脱壳工具并可进行PE编辑。可惜不更新了,己过时,现阶段一般只用来作为PE编辑工具使用。 Win9x/2K 大小:161K https://www.doczj.com/doc/2e12682649.html,/tools/PE_tools/Editor/ProcDump/PDUMP32.ZIP LordPE DLX 强大的PE编辑工具,有了它,其它的相关工具你可以扔进垃圾堆了。 https://www.doczj.com/doc/2e12682649.html,/tools/PE_tools/Lordpe/LPE-DLX.ZIP PEditor 1.7 可修复PE文件头,一款相当方便的PE文件头编辑工具。 417K PE Tools v1.5.4 另一款PE编辑工具。 https://www.doczj.com/doc/2e12682649.html,/tools/PE_tools/Editor/PEditor/PEDITOR.ZIP 输入表重建工具 ImportREC v1.6 FINAL 各类插件可以手工重建Import表,支持UPX、Safedisc 1、PECompact、PKLite32、Shrinker、ASPack, ASProtect、tELock等。 160K

汇编语言基础实验

实验1 DEBUG调试命令的练习(验证性实验) 一、实验目的 熟悉DEBUG环境、练习DEBUG调试程序的主要命令。二、实验内容 利用DEBUG调试程序练习编写和调试小程序段。 三、实验步骤 1.进入DEBUG调试环境; ①首先,点击开始--运行;(也可采用其他方式进入) ②在运行窗口下,输入cmd; ③点击确定之后,转到命令窗口,输入DEBUG并回车; 2.用R 命令查看并记录各寄存器内容及有关标志位的状态。 ①输入R 命令并回车; ②查看并记录有关寄存器内容。

3.用R 命令按表3的要求修改AX,BX,CX,DX等寄存器内容;用R命令查看结果是否正确并采用屏幕截图的方法记录结果。 4.用D查看ds:2000开始内存单元的内容,并采用屏幕截图的方法记录结果。 5.用E命令将‘ ABCDEFGHIJKLMN’, 0D , 0A , ‘ $ ’ 的ASCII码填入内存ds:2000处。 方法1:ASCII码输入; 方法2:字符串输入; 6.用D命令观察内存ds:2000处的16进制码及屏幕右边的ASCII字符是否正确,并采用屏幕截图的方法记录结果。 7.将所有的字符变为小写,重复5、6两步,注意对比大、小写英文字母ASCII码间关系。 8.Q命令退出DEBUG,重新进入DEBUG,用A命令在内存cs:100处键入下列内容: MOV AX,4321 MOV BX,5678 XCHG AX ,BX MOV AH,35 MOV AL,48 MOV DX,75AB XCHG AX,DX 9.用U cs:100命令检查键入的程序并记录,特别注意屏幕左边的机器码。

10.用R 命令对IP寄存器赋初值100; 11.用T命令逐条运行上述指令,每执行一次T命令检查并记录有关寄存器及IP的变化情况。并注意标志位有无变化。(用R 命令检查各寄存器内容,特别注意AX、BX、DX、IP的内容。) 说明:每按一次T命令,按序执行第8步中输入的一条指令,显示执行本条指令后有关寄存器的内容及下一次要执行的指令。 12.用E 命令T执行。 ①用E CS:200命令写入B8 01 00 B9 02 00 01 C8; ②用U CS:200命令对其反汇编,记录汇编指令; 结果:对应的汇编指令为: 13.用R命令先对IP赋初值200,再用T单步命令逐条执行步骤12中的指令,用R命令查看并记录AX、CX寄存器中的内容,并观察IP寄存器中内容的变化。 14.用命令D 观察内存FFFF0H~FFFFFH的内容,查看你所用电脑中的BIOS的生产日期。

ARM平台下ELF文件反汇编

ARM平台下的反汇编 目的 作为代码插桩过程的前提,首先需要对于所提供的二进制代码进行必要的分析,了解ELF文件的结构以及ARM平台的指令编码,将二进制01码翻译成为用户可读的汇编代码。通过对于汇编代码的分析,用户可以得到程序应用中各个函数起始地址以及程序各个模块的流程调用等重要信息,为代码插桩提供详细的数据。经过插桩的代码最后通过再一次汇编的过程输出到目标文件。因此,正确、快速地进行平台下的反汇编工作显得十分关键。 ARM平台介绍[1-2] ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC(精简指令集计算机)处理器、相关技术及软件。技术具有性能高、成本低和能耗低等特点。经历过早期自己设计和制造芯片的不景气之后,公司自己开始不制造芯片,只将芯片的设计方案授权(licensing)给其他公司,由它们来生产,形成了较为独特的盈利模式。RISC结构优先选取使用频率最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻地方式种类减少;以控制逻辑为主,不用或少用微码控制等。ARM处理器在秉承RISC体系优点的基础上,进行了针对嵌入式系统的功能扩展,使得指令更加灵活,处理器性能在嵌入式平台上更加突出。 ARM微处理器的核心结构如下图所示: Figure 1.ARM处理器核心结构示意图[2] 数据指令通过数据总线进入到处理器核心,然后在指令被执行之前经由指令解码器翻译。和所有精简指令集处理器一样,ARM采用了load-store架构,load指令将数据从内存拷贝到寄存器,store指令将数据从寄存器转储到内存,所有的数据处理在寄存器中完成。 ARM处理器是32位的处理器,所有的指令默认将寄存器视为32位的值,因此Sign extend会在数据写入寄存器之前将所有8位或者12位的数值转换为32位的数值。ARM指令通常有两个源寄存器: Rn, Rm 以及一个目标寄存器,操作数都是从寄存器通过内部总线读取得到。 核心的ALU (arithmetic logic unit) or MAC (multiply-accumulate unit) 从内部总线A,B上取得操作数进行运算,然后将结果写入目标寄存器。 ARM处理器一个很大的特色是寄存器Rm可以选择性地在进入ALU运算之前在barrel shifter中进

objdump命令

objdump命令 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 -C --demangle 将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging -g 显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 -e --debugging-tags 类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 --disassemble -d 从objfile中反汇编那些特定指令机器码的section。 -D --disassemble-all 与-d 类似,但反汇编所有section. --prefix-addresses 反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。

-EB -EL --endian={big|little} 指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records. -f --file-headers 显示objfile中每个文件的整体头部摘要信息。 -h --section-headers --headers 显示目标文件各个section的头部摘要信息。 -H --help 简短的帮助信息。 -i --info

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/2e12682649.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

单片机基础知识1章-单片机基础知识

微机原理与接口技术

第一章单片机基础知识 第一节单片机概况 关于课程名称: 《微机原理及应用》或《微机原理及接口技术》,《单片机基础》讲述有关计算机的概念。 计算机有: 微型计算机小型机大型机 按尺寸大小来分,现在界线已模糊。 或按功能强弱来分(尺寸小不等于是差的计算机) 在工业控制或其他应用领域:适用的就是最好的 当一个设备上应用了计算机就可以称做智能设备。 计算机---功能决定了智能化程序。 主要由产品的要求决定。 计算机包括软件和硬件, 硬件构成:五部分=CPU(运算器,控制器),存储器,输入,输出 计算机硬件 控制器C P U 存 储 器 输 入 输 出 运算器只要在硬件结构上包含上述5项,即可称为计算机。

计算机的功能魅力: 例1 例 2 开关 与门

计算机软件:应用型软件,系统软件(对于通用计算机,这一点区分较清楚) 从结构上讲: 应用软件单片机系统侧重 是一种有特定功能的计算机 操作系统 底层BIOS-basic I/O system 硬件 本课程将侧重于:对于一个测/控目标,如何建立一个基于单片机的计算机系统。因此须了解: 单片机硬件结构 单片机功能 单片机的特性 语言 开发方法 参考书和杂志: 1.张迎新等.《单片机初级教程--单片机基础》北京航空航天大学出版社 2.何立民著《单片机应用系统设计》北京航空航天大学出版社 3.李朝青著.《单片机原理及接口技术》(简明修定版).北京航空航天大学出版社,1999 4.单片机与嵌入式系统应用 5.石文华.单片机原理及应用(面向21世纪高等教育规划教材),中国电力出版社.2005.2

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

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.doczj.com/doc/2e12682649.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毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

汇编语言入门教程

汇编语言入门教程 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),有九个有意义的标志,将在下文用到时详细说明。

ARM汇编程序设计

cmp r0,#5 bcs aaa add r0,r0,#1 aaa nop cmp r0,#5 addcc r0,r0,#1 bl指令完成两个功能:将子程序的返回地址保存在LR即R14同时将PC的值改为目标子程序的第一条指令的地址。 Start: Mov r0,#10 Mov r1,#3 Bl doadd Mov r1,r1,r0 Doadd Add r0,r0,r1 Mov pc,lr .end 用汇编程序实现IF语句的功能: Mov r0,#15 Mov r1,#12 Cmp r0,r1

Movhi r2,#100 Movls r2,#50 用汇编程序实现FOR循环的功能:Mov r0,#0 Mov r1,#10 Mov r2,#0 L1: cmp r0,r1 Bhs l2 Add r2,r2,#1 Add r0,r0,#1 B l1 L2: .end 用汇编语言实现WHILE循环While(x<=y) X=x*2; mov r0,#1 mov r1,#20 b l2 l1: mov r0,r0, lsl #1 l2: cmp r0,r1 bls l1 end

用汇编语言实现计算算术功能:n equ 100 .global _start -start: .arm arm_code: Ldr sp,=0x40003f00 Adr r0,thumbcode+1 Bx r0 .ltorg .thumb Thumb_code: Ldr r0,=n Bl sum_n B thumb_code Sum_n: Push {r1-r7,lr} Movs r2,r0 Beq sum_end Cmp r2,#1 Beq sum_end Mov r1,#1

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 目录

实验二_ARM汇编语言程序设计

实验二ARM汇编语言程序设计 实验目的 1、了解ARM汇编语言程序的结构特点 2、了解ARM汇编语言程序的编写方法 3、掌握用ARM汇编语言设计简单程序 实验仪器设备及软件 ARM实验箱,计算机,ADS程序开发软件 实验原理 1、存储空间的格式 ARM920将存储空间视为从0开始由字节组成的线性集合,字节0-3中保存了第一个字,字节4-7中保存了第二个字,依此类推。字节还可以按小端格式或大端格式排列。ARM实验箱中存储器的配置见附录C。 2、ARM的寄存器 ARM状态下任何时刻都可以看到16个通过寄存器(r0-r15),1或2个状态寄存器(CPSR,SPSR),在特权模式下会切换到具体模下的寄存器组。每个寄存器都是32位的,并且每个通用寄存器都可以作为数据处理的源数据或目标数据寄存器。因此可以编写出更精简的程序。 3、ARM指令的条件执行 状态寄存器中的N,Z,C,V是数据处理指令影响的标志。几乎每条ARM指令可以根据状态位或状态位的逻辑运算有条件执行。条件执行的指令后缀参考教材。 4、桶形移器 ARM的桶形移位器,使ARM指令的中第二个操作数非常录活。利用移位器,一条ARM 指令可以完成更多功能。移位操作有: LSL 逻辑左移 LSR 逻辑右移 ASL 算术左移 ASR 算术右移 ROR 循环右移 RRX 带扩展循环右称 实验内容 1、把内存中ramaddr开始的ramword个字清零 (1)用后变址法 ramaddr equ 0x31000000 ramword equ 64 clrram mov r0,#0 mov r1,#ramword ldr r2,=ramaddr clrram1 str r0,[r2],#4 subs r1,r1,#1

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩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),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

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