当前位置:文档之家› 反汇编为Award BIOS ACPI增加动态寻址的SLIC表

反汇编为Award BIOS ACPI增加动态寻址的SLIC表

反汇编为Award BIOS ACPI增加动态寻址的SLIC表
反汇编为Award BIOS ACPI增加动态寻址的SLIC表

这里,我用网友songsu在昨天发给我的BIOS文件050318.BIN为例, 讲解一下如何植入SLIC 文件的,并会附上这个文件给大家对照着练一把:

注意:

1数值类型为Hex, 且数值在文件中为低字节在前,高字节在后

2 IDA的代码用字符方式显示,如果变成图形方式显示时,可点击鼠标右键,在菜单中选TEXT VIEW即可回到字符方式显示

1.将CBROM, MODBIN6两个工具和SLIC.BIN,050318.BIN(扩展名不是BIN一定要改成BIN,

因为MODBIN6只识别.BIN的文件)放在同一目录下, 我的演示目录是E:\BIOS\TRY

2.首先,确认RSDT…FACS字段在哪个文件包内:

A.执行CBROM 050318.BIN /D,出现以下信息:

E:\bios\try>CBROM.EXE 050318.BIN /d

CBROM V2.19 (C)Award Software 2001 All Rights Reserved.

******** 050318.BIN BIOS component ********

No. Item-Name Original-Size Compressed-Size Original-File-Name

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

0. System BIOS 20000h(128.00K) 13B3Eh(78.81K) 83IID318.BIN

1. XGROUP CODE 0DFF0h(55.98K) 0993Ch(38.31K) awardext.rom

2. ACPI table 043E5h(16.97K) 01A46h(6.57K) ACPITBL.BIN

3. EPA LOGO 0168Ch(5.64K) 002AAh(0.67K) AwardBmp.bmp

4. YGROUP ROM 0F570h(61.36K) 0482Dh(18.04K) awardeyt.rom

5. GROUP ROM[ 0] 04CD0h(19.20K) 02261h(8.59K) _EN_CODE.BIN

6. Other(404E:0000) 03476h(13.12K) 00EB4h(3.68K) 64N8IIP.BMP

7. Other(404F:0000) 0345Dh(13.09K) 008B9h(2.18K) 64N8P4P.BMP

8. Other(4050:0000) 0345Dh(13.09K) 008CCh(2.20K) 64N8P4HT.BMP

9. Other(4051:0000) 04286h(16.63K) 00A7Eh(2.62K) 64N8P4E.BMP

10. Other(4052:0000) 04286h(16.63K) 00B58h(2.84K) 64N8P4HE.BMP

11. Other(4053:0000) 0345Dh(13.09K)007D9h(1.96K)64N8ICPD.BMP

12. PCI ROM[A] 0D000h(52.00K)07DA8h(31.41K)RTM8100.LOM

Total compress code space = 4B000h(300.00K)

Total compressed code size = 31788h(197.88K)

Remain compress code space = 19878h(102.12K)

** Micro Code Information **

Update ID CPUID | Update ID CPUID | Update ID CPUID | Update ID CPUID

------------------+--------------------+--------------------+------------------

PGA478 2E 0F29|

E:\bios\try>

B.在050318.BIN 文件中不含ggroup.bin , 所以RSDT…FACS字段在System BIOS代码中,

这就需要用MODBIN6了, 如果你的BIOS中含有ggroup.bin, 那你就可以用CBROM 把ggroup.bin 文件分离出来,如我的技嘉G1975X的BIOS:

No. Item-Name Original-Size Compressed-Size Original-Fi

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

0. System BIOS 20000h(128.00K)1492Ah(82.29K)G1975X.BIN

1. XGROUP CODE 0F7B0h(61.92K)0A8E6h(4

2.22K)awardext.rom

2. EPA LOGO 0168Ch(5.64K)0030Dh(0.76K)AwardBmp.bmp

3. GROUP ROM[18] 00EF0h(3.73K)00B77h(2.87K)ggroup.bin

4. YGROUP ROM 07140h(28.31K)04D7Ch(19.37K)awardeyt.rom

5. FNT1 ROM 02D28h(11.29K)02038h(8.05K)font1.awd

6. FNT2 ROM 03278h(12.62K)01F18h(

7.77K)font2.awd

7. FNT3 ROM 025FCh(9.50K)017FBh(6.00K)font3.awd

8. GROUP ROM[ 0] 06010h(24.02K)02787h(9.88K)_EN_CODE.BIN

9. GROUP ROM[ 1] 06510h(25.27K)02A1Fh(10.53K)_FR_CODE.BIN

10. GROUP ROM[ 3] 06420h(25.03K)02A75h(10.61K)_GR_CODE.BIN

11. GROUP ROM[ 4] 068D0h(26.20K)02A74h(10.61K)_SP_CODE.BIN

12. GROUP ROM[ 8] 04EF0h(19.73K)02575h(9.36K)_B5_CODE.BIN

13. GROUP ROM[10] 04F60h(19.84K)025E9h(9.48K)_GB_CODE.BIN

14. GROUP ROM[11] 05E50h(23.58K)02A85h(10.63K)_JP_CODE.BIN

15. PCI ROM[A] 0F200h(60.50K)09594h(37.39K)ICH7RAID.BIN

16. PCI ROM[B] 10000h(64.00K)09A15h(38.52K)b169d.pxe

17. LOGO1 ROM 00B64h(2.85K)00520h(1.28K)dbios.bmp

18. PCI ROM[C] 04000h(16.00K)02287h(8.63K)ITE8212.ROM

19. Other(4067:0000) 01AADh(6.67K)00B75h(2.86K)PPMINIT.ROM

20. OEM0 CODE 025B3h(9.42K)01B37h(6.80K)dbf.bin

21. GROUP ROM[24] 00132h(0.30K)0011Eh(0.28K)SPECIAL.FNT

22. ACPI table 09640h(37.56K)0352Ch(13.29K)ASUSACPI.BIN

Total compress code space = 67000h(412.00K)

Total compressed code size = 57613h(349.52K)

Remain compress code space = 0F9EDh(62.48K)

** Micro Code Information **

Update ID CPUID | Update ID CPUID | Update ID CPUID | Upd

------------------+--------------------+--------------------+-----

SLOT1 0A 0F32| PGA423 2C 0F25| 00000000 00000000 0000

00000000 00000000 0000 0000| 00000000 00000000 0000

00000000 00000000 0000 0000| 00000000 00000000 0000

00000000 00000000 0000 0000| 00000000 00000000 0000

00000000 00000000 0000 0000| 00000000 00000000 0000

00000000 00000000 0000 0000|

E:\bios\bios>CBROM.EXE G1975X.bin /group18 extract

CBROM V2.19 (C)Award Software 2001 All Rights Reserved.

Enter an extract file Name :(ggroup.bin)

[GROUP] ROM is extracted to ggroup.bin

C.执行CBROM 050318.BIN /ACPI extract, 分解出ACPITBL.BIN, 含ggroup.bin 的BIOS可

以跳过下一步

E:\bios\try>CBROM.EXE 050318.BIN /acpi extract

CBROM V2.19 (C)Award Software 2001 All Rights Reserved.

Enter an extract file Name :(ACPITBL.BIN)

[ACPI] ROM is extracted to ACPITBL.BIN

D.执行,并选择050318.BIN, 等待ORIGINAL.BIN被分解出来

3.修改ACPITBL.BIN

A.运行ULTRAEDIT, 并打开ACPITBL.BIN

B.RSDT后面的RSDT表长度数值加4, 这里是002C, 就要改成0030, 并在原有长度位

置插入4个字节的数值00, 可在其它地方复制4个字节的00,再粘贴到此处。这里的修改是为存放SLIC表地址留出空间,记住这个地址,我们给这个地址一个名称:SLICadress。这里,SLICadress的值为002C。

改前:

改后:

C.留意ACPITBL.BIN文件的长度是否能被4整除,不是的话,就要在文件尾补足1至3

个字节的00,这是为了保证合并SLIC.BIN文件后,SLIC表头的地址能能被4整除

改前文件尾在43E8,即文件长度为43E9,不能被4整除:

增加3个字节,改后:

D.根据你的需求,修改OEM_ID

E.保存文件,再执行COPY ACPITBL.BIN /B + SLIC.BIN /B ACPI.BIN /B, 这样,就得到

你需要的ACPITBL 文件了

4.搜寻ORIGINAL.BIN 或ggroup.bin 中的代码,找到临时存放每个表头地址值的空间位置,

这个地址,我们称之为TempBuffer_Adress

A.用ULTRACT打开ORIGINAL.BIN 或ggroup.bin 文件

B.运行IDA

C.点击Go,进入IDA, 选择并打开ORIGINAL.BIN 文件

D.在ProcessType 下拉菜单中选择intel 80x86 processors:80686p

E.选好后点击右边的Set

F.点击OK后选YES

G.选择No,我们要用16bit 代码模式

H.在右边的String Window中找到RSDT…FACS的字串,并双击它

I.将鼠标定位在R 字符处

按下A 键,RSDT…FACS字串出来了,这个字串我们称之为ACPItables

J.再将鼠标定位在RSDT…FACS字串ACPItables后的db 1Eh 出

按下C 键,有一段汇编代码呈现在你的面前,但后面的还没出来,继续

K.再将鼠标定位在RSDT…FACS字串ACPItables后的db 1Eh 出unk_CC49,同样按下C 键,大部分代码也呈现出来了

L.接下来,我们把鼠标从下图中的几个CALL …上移过

M.看看那个CALL会弹出类似

push eax

push cx

push ebp

xor ebp, ebp

mov cx, TABLE_Numbers;这里暂时用TABLE _Numbers代替某个数mov edi, eax

的代码,这个例子中是call sub_CCD4

双击sub_CCD4,来到sub_CCD4 代码段,如果此时显示被称图形方式,可以点击鼠标右键,在菜单中选择TEXT View, 即可回到字符模式在这段代码中,我们将得到3个很重要的参数,TABLE_Numbers,ACPItables_adress,TempBuffer_Adress,并将它们和他们所在的位置记录在白纸上,例子中,这几个数分别为:4,CC20,89C4,地址大概分别在:CCDC,CCE2,CD12

将TempBuffer_Adress的值(4的倍数)和RSDT…FACS字串如下列在白纸上:89C4 RSDT

89C8 FACP

89CC DSDT

89D0 APIC

89D4 FACS

89D8

89DC

N.前面那段代码就是根据RSDT…FACS字串在ACPITBL文件中找到需要的表,将它们分别复制到某个地址空间,并将这些地址值存依次放在TempBuffer_Adress指定的空间中,最后再将这些地址填充到特定的表中,所以我们要确认在这期间,TempBuffer_Adress存放的数值不能被改动。这个例子BIOS就是在此期间改变了89CC中的数据,所以我的第一次修改没有成功,:)

O.下面转到ULTRAEDIT程序,按CTRL+F,搜寻D889 (即89D8,地字节在前,高字节在后),并在几个位置发现到它,记下其中小于FFFF的几个位置(82D4,CC91),如果没有搜到,那就恭喜你了,你可以直接使用存放FACS地址(89D4)后面的的那个地址(89D8),也就是直接将SLIC并在FACS的后面,再找个地方存放这个字串(前移4字节或是另起炉灶)

很不幸,我们在IDA中可以看到CC91附近有这样的代码,

seg000:CC80 sub_CC80 proc near ; CODE XREF: seg000:CC52p

seg000:CC80 push ds

seg000:CC81 mov ax, 0F000h

seg000:CC84 mov ds, ax

seg000:CC86 assume ds:nothing

seg000:CC86 add edi, 10h

seg000:CC8A and di, 0FFF0h

seg000:CC8D mov large ds:89D8h, edi

seg000:CC95 pop ds

seg000:CC96 assume ds:nothing

seg000:CC96 retn

seg000:CC96 sub_CC80 endp

而且这段代码在call sub_CCD4后即被调用,所以,我们去ULTRAEDIT查找DC89,,还好,这次没有搜到,我们就把SLIC表的地址暂时放在这吧。不过SLIC和FACS之

间还隔了一个89D8怎么办,没关系,我们就在RSDT…FACS字串后面添加FACSSLIC

字段好了,呵呵,反正FACS表较小,不会占用太多内存,但我们下面的工作就好

做多了

5.存放修改后的字串RSDT…FACSFACSSLIC

由于我们增加了8个字节,就要给这个字串找个新家. 还好这个例子BIOS中,在原有ACPItables_adress地址(CC20)前面有11个字节的00,而经验告诉我,这么长的00,一般都是无效代码,而且在ULTRAEDIT中查不到FFFF之前的代码使用CC18 或是CC1C 这两个地址,所以,就把新的字串放到CC18开始的地址吧

6.字串RSDT…FACSFACSSLIC 已乔迁新居,门牌号换了(CC18),要告诉大家才对。我们在

ULTRAEDIT中搜索20CC, 找的前面记下的CCE2 附近,

把20改成18

7.大家可以注意到,第5步骤中的两个图片,FACS字段在文件中的位置发生了变化,原来

为CC30,新地址为CC28或CC2C,而后面有代码用到这个位置,所以我们也要更改它

这个地址值就是原来的ACPItables_adress地址(CC20)+ 10 = CC30,在ULTRAEDIT中,在CD35附近找到30CC

把它改成CC28或CC2C

到这里,你可以保存一下你的工作,休息一会儿,下面的工作更需要你的细心和耐心

8.现在SLIC地址可以暂时存放在89DC,怎么把它填到ACPI.BIN中我们在RSDT表中为他留

下的位置中呢,下面你先看看这段代码:

seg000:CD74

seg000:CD74 sub_CD74 proc near ; CODE XREF: seg000:CC5Bp

seg000:CD74 push edi

seg000:CD76 push esi

seg000:CD78 mov esi, 0F0000h

seg000:CD7E mov eax, [esi+89C4h]; 填充RSDT地址到RSDT Ptr seg000:CD86 or eax, eax

seg000:CD89 jz loc_CE32

seg000:CD8D mov [esi+89C0h], eax ; RSDT Ptr

seg000:CD95 mov eax, [esi+89CCh]; 填充DSDT地址到FACP seg000:CD9D or eax, eax

seg000:CDA0 jz loc_CE32

seg000:CDA4 mov edi, [esi+89C8h]; FACP

seg000:CDAC mov es:[edi+28h], eax

seg000:CDB2 mov eax, [esi+89D4h]; 填充FACS地址到FACP

seg000:CDBA or eax, eax

seg000:CDBD jz loc_CE32

seg000:CDC1 mov edi, [esi+89C8h] ; FACP

seg000:CDC9 mov es:[edi+24h], eax

seg000:CDCF mov eax, [esi+89C8h]; 填充FACP地址到RSDT+24

seg000:CDD7 or eax, eax

seg000:CDDA jz loc_CE32

seg000:CDDE mov edi, [esi+89C4h] ; RSDT

seg000:CDE6 mov es:[edi+24h], eax

seg000:CDEC cmp byte ptr [bp+1BFh], 7

seg000:CDF1 jnz short loc_CDFE

seg000:CDF3 test dword ptr [bp+1C6h], 200h

seg000:CDFC jz short loc_CE2F

seg000:CDFE

seg000:CDFE loc_CDFE: ; CODE XREF: sub_CD74+7Dj

seg000:CDFE test byte ptr [bp+2EBh], 4

seg000:CE03 jz loc_CE2F

seg000:CE07 mov eax, [esi+89D0h] ; 填充ACPI地址到RSDT+28

seg000:CE0F or eax, eax

seg000:CE12 jz short loc_CE2F

seg000:CE14 mov edi, [esi+89C4h]

seg000:CE1C mov es:[edi+28h], eax

seg000:CE22 mov edi, eax

seg000:CE25 push es

seg000:CE26 call sub_B4BB

seg000:CE29 pop es

seg000:CE2A jb short loc_CE2F

seg000:CE2C call sub_5077

9.还记得前面要求你写下的那个地址与字段的对应表格吗,呵呵,你就用它对照着看上面

的代码。上面的代码中,你找不到填充89DC 中的数据到RSDT表的代码,所以你得自己将这段代码加上:

mov eax, [esi+89DCh] ;8字节

mov edi, [esi+89C4h] ;8字节

mov es:[edi+2Ch], eax; 6字节还记得前面那个SLICadress 的值吗?对,就是2C

但是又不能因为加了这段代码而影响到后面函数的入口地址,所以我们需要删掉一部分无关大雅的代码,为我们的代码留出空间

上面代码中每个mov eax, [esi+????h],后面都跟着

or eax, eax ;3字节

jz short loc_CE2F ;2字节

这本是检验数值是否是0(我们叫空指针),以防系统崩溃的预防措施,但我分析了后面的代码,其中有对RSDT表重新整理的代码,可以去掉空指针。那我们就把写入RSDT表

的数据效验部分删掉,这里一共有两处

seg000:CDD7 or eax, eax ;3字节

seg000:CDDA jz loc_CE32 ;2字节

seg000:CE0F or eax, eax ;3字节

seg000:CE12 jz short loc_CE2F ;2字节

但还只是留出了10字节空间,李我们需要的22字节还差得远呢,怎么办?

大家留意一下,前面的代码在填数据到RSDT时,每次都执行了

mov edi, [esi+89C4h] ;8字节

指令(包括我们的代码),但是在执行两次填入RSDT表的动作时,并没有改变edi寄存器的值,所以我们只需要执行一次这个指令,而且,如果把新加的代码也放在其中,与同样可以省略掉这条指令,这样一增一减,空间就足够了,多出来的空间嘛,找个合适的地方放几条空指令(90和,nop)我们的最终代码就将如下:

seg000:CDCF

mov eax, [esi+89C8h]; 填充FACP地址到RSDT+24

mov edi, [esi+89C4h] ; RSDT

mov es:[edi+24h], eax

mov eax, [esi+89DCh]

mov es:[edi+2Ch], eax

nop

nop

nop

nop

cmp byte ptr [bp+1BFh], 7

jnz short loc_CDFE

test dword ptr [bp+1C6h], 200h

jz short loc_CE2F

test byte ptr [bp+2EBh], 4

jz loc_CE2F

mov eax, [esi+89D0h] ; 填充ACPI地址到RSDT+28

seg000:CE22 mov es:[edi+28h], eax 这条指令的地址不能发生变化

我们得记下上面要删的代码和插入代码的位置:

seg000:CDD7 or eax, eax ;3字节

seg000:CDDA jz loc_CE32 ;2字节

CDD7开始5个字节

seg000:CE0F or eax, eax ;3字节

seg000:CE12 jz short loc_CE2F ;2字节

seg000:CE14 mov edi, [esi+89C4h]

CE0F开始5+8个字节

seg000:CDEC cmp byte ptr [bp+1BFh], 7

原CDEC处插入我们所需的全部代码

10.修改方案已出,我们就需要回到ULTRAEDIT去做这些动作了,我们最好从后往前修改,

以防盖了前面,后面的地址就乱了。

首先,删掉CE0F 出开始的13个字节,

然后在CDEC插入4个字节的任意数据,再将其改成4个90(90h=nop)

复制CDE6_CDEB 的代码,将其粘贴到CDEC出并修改成我们需要的指令mov es:[edi+2Ch], eax

复制CDCF_CDD6 的代码,将其粘贴到CDEC出并修改成我们需要的指令mov eax, [esi+89DCh]

删掉CDD7出开始的5个字节

存盘,大功告成,为了检查修改的结果是否正确,我们需要重新IDA,看看修改出的代码是否符合我们的要求,是的话,就可以将改好的文件重新打包回BIOS文件了

内存寻址的三种模式

内存寻址的三种模型 1. 地址的种类 首先明确一下逻辑地址和线性地址这两个概念: 1. 逻辑地址 2. 线性地址 3. 物理地址 1.1 逻辑地址: 逻辑地址是编译器生成的,我们使用在linux环境下,使用C语言指针时,指针的值就是逻辑地址。对于每个进程而言,他们都有一样的进程地址空间,类似的逻辑地址,甚至很可能相同。 1.2 线性地址: 线性地址是由分段机制将逻辑地址转化而来的,如果没有分段机制作用,那么程序的逻辑地址就是线性地址了。 1.3 物理地址 物理地址是CPU在地址总线上发出的电平信号,要得到物理地址,必须要将逻辑地址经过分段,分页等机制转化而来。 2. 三种寻址模型 x86体系结构下,使用的较多的内存寻址模型主要有三种: 1. 实模式扁平模型real mode flat model 2. 实模式分段模型real mode segment model 3. 保护模式扁平模型protected mode flat model 下面是对这三种模型的描述 实模式和保护模式相对,实模式运行于20位地址总线,保护模式则启用了32位地址总线,地址使用的是虚拟地址,引入了描述符表;虽然二者都引入了段这样一个概念,但是实模式的段是64KB固定大小,只有16KB个不同的段,CS,DS等存储的是段的序号(想想为什么?)。保护模式则引入了GDT和LDT段描述符表的数据结构来定义每个段。 扁平模型和分段模型相对,区别在于程序的线性地址是共享一个地址空间还是需要分成多个段,即为多个程序同时运行在同一个CS,DS的范围内还是每个程序都拥有自己的CS,DS:前者(flat)指令的逻辑地址要形成线性地址,不需要切换CS,DS;后者的逻辑地址,必须要经过段选择子去查找段描述符,切换CS,DS,才能形成线性地址。 3. 实模式扁平模型 该模式只有在386及更高的处理器中才能出现! 80386的实模式,就是指CPU可用的地址线只有20位,能寻址0~1MB的地址空间。 注意:80386的实模式并不等同于8086/8088的实模式,后者的实模式其实就是实模式分段模型! 扁平模型,意味着我们这里不使用任何的分段寄存器。(其实还是使用了CS,DS,只是不用程序员去显示地为该寄存器赋值,jmp指令时就已经将CS, DS设置好了) Linux启动代码arch/i386/boot/bootsect.S就工作在该模式下。

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用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):指

电脑各种BIOS设置面图解教程

内容简介 [1] AWARD BIOS设置图解教程 [2] AMI BIOS设置图解教程 [3] 新AWARD BIOS设置图解教程 [4] 附:BIOS自检响铃含义BIOS还原 [5] BIOS常见错误信息和解决方法 BIOS(basic input output system 即基本输入输出系统)设置程序是被固化到计算机主板上的ROM芯片中的一组程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控

制。BIOS设置程序是储存在BIOS芯片中的,只有在开机时才可以进行设置。CMOS主要用于存储BIOS设置程序所设置的参数与数据,而BIOS设置程序主要对技巧的基本输入输出系统进行管理和设置,是系统运行在最好状态下,使用BIOS设置程序还可以排除系统故障或者诊 断系统问题。 在我们计算机上使用的BIOS程序根据制造厂商的不同分为:AWARD BIOS程序、AMI BIOS程序、PHOENIX BIOS程序以及其它的免跳线BIOS 程序和品牌机特有的BIOS程序,如IBM等等。 目前主板BIOS有三大类型,即AWARD AMI和PHOENIX三种。不过,PHOENIX已经合并了AWARD,因此在台式机主板方面,其虽然标有AWARD-PHOENIX,其实际还是AWARD的BIOS的. Phoenix BIOS 多用于高档的586原装品牌机和笔记本电脑上,其画面简洁,便于操作。

[1] AWARD BIOS设置图解教程 一、进入AWARD BIOS设置和基本选项 开启计算机或重新启动计算机后,在屏幕显示“Waiting……”时,按下“Del”键就可以进入CMOS的设置界面(图 1)。要注意的是,如果按得太晚,计算机将会启动系统,这时只有重新启动计算机了。大家可在开机后立刻按住Delete键直到进入CMOS。进入后,你可以用方向键移动光标选择CMOS设置界面上的选项,然后按Enter进入副选单,用ESC键来返回父菜单,用PAGE UP和PAGE DOWN键来选择具体选项,F10键保留并退出BIOS设置。 图 1 STANDARD CMOS SETUP(标准CMOS设定) 用来设定日期、时间、软硬盘规格、工作类型以及显示器类型 BIOS FEATURES SETUP(BIOS功能设定)

实验二 内存操作数及寻址方法1

实验二内存操作数及寻址方法 一、实验目的: 通过实验掌握下列知识: 1、DEBUG命令:G,N,W,L及Q。 2、8088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。 3、8088指令:INC,DEC,LOOP,INT 3,INT 20H,寄存器SI,DI。 4、8088汇编语言伪操作:BYTE PTR,WORD PTR。 5、求累加和程序和多字节加减法程序。 二、实验内容和步骤: 1、内存操作数及各种寻址方式使用: MOV AX,1234 ;立即寻址 MOV [1000],AX;直接寻址 MOV BX,1002 MOV BYTE PTR[BX],20;存在一个字节里 MOV DL,39 INC BX MOV [BX],DL DEC DL MOV SI,3 MOV [BX+SI],DL 间接寻址 MOV [BX+SI+1],DL MOV WORD PTR[BX+SI+2],2846;存在两个字节中 步骤: 1)输入程序:A 起始地址(默认100H); 2)单步执行程序:采用T命令; 3)查看结果:D 内存单元地址 实验要求:每运行一条指令,检查并记录有关内存单元的内容并注明是什么寻址方式。 注意D命令显示结果中右边的ASCII字符及双字节数存放法。 思考:有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。 2、求累加和程序: MOV BX,1000 MOV CX,10 SUB AX,AX LOP: ADD AL,[BX] ADC AH,0 INC BX J: LOOP LOP INT 3 步骤: 1)输入程序:用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实 际地址,在键入LOOP指令时LOP用实际地址值代替。

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句: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. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

BIOS设置图解教程(全)

《BIOS设置图解教程》 BIOS设置图解教程之AMI篇 (目前主板上常见的BIOS主要为AMI与AWARD两个系列,如何辨别BIOS品牌系列请移步,本文详细讲解AMI系列的BIOS设置图解教程,如果你的BIOS为AWARD系列请移步BIOS设置图解教程之Award篇,文中重要的部分已经标红,快速阅读请配合图片查阅红色加速字体即可) 对于很多初学者来说,BIOS设置是一件非常头疼的事情,面对着满屏的E文,实在是无从下手。但是,设置BIOS在高手的眼里,却什么也算不上。 当你看着高手的指尖在键盘上熟练的跳动,而蓝色屏幕里的字符不停的变换,你一定很羡慕,不是吗? 实际上,BIOS设置并不是特别神秘的事情,但是为什么初学者却会如此头疼呢。根据归纳,总结出了几点原因,希望初学者能够避免被这些因素所左右。 ●听别人说操作BIOS很危险 在这里,笔者不否认操作BIOS有一定的风险,BIOS是Basic Input Output System的缩写,乃基本输入/输出系统的意思,也就是计算机里最基础的引导系统,如果BIOS设置错误,硬件将会不正常工作。 操作BIOS真的很危险吗? 笔者听到很多朋友都在说,设置BIOS很危险,从一个人接触计算机开始,就被前人在BIOS上蒙上了一层神秘的黑纱。可以说,几乎每一个人都知道设置BIOS是一项非常危险的操作,也正是因为这样,菜鸟们也就不敢轻易尝试。但如果你不去尝试,就永远也不会学到该如何设置。所以,在此笔者建议,再危险的 事情我们也要去尝试,敢于尝试是菜鸟变成高手的必备心理素质。

●一看到全英文界面就没信心 很多菜鸟一看到满屏的英文,就完全没有了设置的信心,根本不愿意仔细去看其中的内容,这样自然也不会去深入研究了。但实际上,BIOS里很多设置项目英语都非常简单,在学校里英语不是特别差的人,都基 本上能领会其大意,实在不懂得也不必去调试,毕竟BIOS里经常修改的也就那么几个项目。所以,当你 进入BIOS之后,千万不要被其中满屏的E文所吓倒,这样才能慢慢的学会调教BIOS。 ●习惯于求助别人帮忙 菜鸟和高手在初期是没有区别的,但是菜鸟在遇到问题的时候,求助于别人帮忙搞定,而高手却喜欢自己去查询资料。设置BIOS也是一样,很多人用过10年电脑,都还不知道怎么在BIOS设置光驱为首个引导设备,导致连操作系统都还不会安装。很显然,10年之后,他仍然是一只菜鸟。而喜欢研究的高手,想必在用电脑半年时间内,就会熟悉安装各种操作系统,调试最基本的BIOS。一点也不夸张的说,笔者在使用电脑三个月之后,就已经知道数十条DOS命令了(笔者从Win 3.1时代使用电脑的)。

一个简单的C程序反汇编解析.

一个简单的 C++程序反汇编解析 本系列主要从汇编角度研究 c++语言机制和汇编的对应关系。第一篇自然应该从最简单的开始。 c++的源代码如下: class my_class { public : my_class( { m_member = 1; } void method(int n { m_member = n; } ~my_class( { m_member = 0; } private :

int m_member; }; int _tmain(int argc, _tchar* argv[] { my_class a_class; a_class.method(10; return 0; } 可以直接 debug 的时候看到 assembly 代码,不过这样获得的代码注释比较少。比较理想的方法是利用 vc 编译器的一个选项 /fas来生成对应的汇编代码。 /fas还会在汇编代码中加入注释注明和 c++代码的对应关系,十分有助于分析。 build 代码便可以在输出目录下发现对应的 .asm 文件。本文将逐句分析汇编代码和 c++的对应关系。 首先是 winmain : _text segment _wmain proc push ebp ; 保存旧的 ebp mov ebp, esp ; ebp保存当前栈的位置 push -1 ; 建立 seh(structured exception handler链 ; -1表示表头 , 没有 prev

push __ehhandler$_wmain ; seh异常处理程序的地址 mov eax, dword ptr fs:0 ; fs:0指向 teb 的内容,头 4个字节是当前 seh 链的地址 push eax ; 保存起来 sub esp, d8h ; 分配 d8h 字节的空间 push ebx push esi push edi lea edi, dword ptr [ebp-e4h] ; e4h = d8h + 4 * 3,跳过中间 ebx, esi, edi mov ecx, 36h ; 36h*4h=d8h,也就是用 36h 个 cccccccch 填满刚才分配的 d8h 字节空间 mov eax, cccccccch rep stosd mov eax, dword ptr ___security_cookie xor eax, ebp push eax ; ebp ^ __security_cookie压栈保存 lea eax, dword ptr [ebp-0ch] ; ebp-0ch 是新的 seh 链的结构地址(刚压入栈中的栈地址 mov dword ptr fs:0, eax ; 设置到 teb 中作为当前 active 的 seh 链表末尾 到此为止栈的内容是这样的: 低地址 security cookie after xor

计算机的寻址范围

一、什么叫寻址空间? 寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的,CPU在运算的时候需要把数据提取出来就需要知道数据在那里,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位。通常人们认为,内存容量越大,处理数据的能力也就越强,但内存容量不可能无限的大,它要受到系统结构、硬件设计、制造成本等多方面因素的制约,一个最直接的因素取决于系统的地址总线的地址寄存器的宽度(位数)。计算机的寻找范围由总线宽度(处理器的地址总线的位数)决定的,也可以理解为cpu寄存器位数,这二者一般是匹配的。Intel公司早期的CPU产品的地址总线和地址寄存器的宽度为20位,即CPU的寻址能力为2^20=1024*1024字节=1024K字节=1M字节;286的地址总线和地址寄存器的宽度为24位,CPU的寻址能力为2^24=1024*4*1024*4B=4*1024*4KB=16M;386及386以上的地址总线和地址寄存器的宽度为32位,CPU的寻址能力为2^32=4096M字节=4G字节。也就是说,如果机器的CPU过早,即使有很大的内存也不能得到利用,而对于现在的PⅡ级的CPU,其寻址能力已远远超过目前的内存容量。由此推出:地址总线为N位(N 通常都是8的整数倍;也说N根数据总线)的CPU寻址范围是2的N次方字节,即2^N(B)。 二、16位、32位、64位通常指的是什么? 从CPU的发展史来看,从以前的8位到现在的64位,8位也就是CPU在一个时钟周期内可并行处理8位二进字符0或是1,那么16就以此类推,是64位就64位二进制,从数据计算上来讲理论上64位比32快一半。但因为电脑是软硬相配合才能发挥最佳性能,所以操作系统也必须从32位的到64位的,而且系统的硬件驱动也必须是64位的。在64位CPU的计算机上要安装64位操作系统64位的硬件驱动,32位的硬件驱动是不能用的,只有这样才能发挥计算机的最佳性能。如果64位CPU装32操作系统的话,那性能不会有明显的提升。 三、为什么是2的N次方,而不是其他数的N次方? 因为计算机是采用二进制计算的。假设一台计算机,它只有1根地址线,请问它最多能对几个存储单元寻址?答案是:2个。因为在任何2进制计算机中,所有物理元件只有0,1两种状态,对应这个例子,我们假设已经把这唯一的一根地址线与两个存储单元a和b连上了,那么究竟怎么确定何时读a何时读b?有一个办法,当地址线上的电压是高电压时我们读a,相反是低电压时,我们读b。如此一来,一根地址线的情况下,只能对2个存储单元进行寻址依次类推,2根地址线时可以对4个存储单元进行寻址,对应的电压情况可以是:低低,低高,高低,高高;继续想下去,3根地址线就可以对8个存储单元进行寻址(3个1和3个0不同组合情况:111、110、100、000、101、100、001、011),4根就是16个,也就是说,当有n根地址线时,可以对2的n次方个存储单元进行寻址。 四、什么是存储单元?

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/618187278.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这样了。看了下面图上的红圈就知道是怎么回事了。 接着就会看到一片空白。这时就是新的“办公区”了。

Ami bios设置图解教程AMI

AMI Bios 设置全程图解 最新AMI Bios 设置全程图解 花了几个星期的时间终于把这个文章完全写玩了,呵呵。于是迫不及待的传上来!文章很长,看上去有一点累,但是我也是为了所有的读者都能看懂,而且尽量讲的详细一些,(想必这应该是国内目前最完善的Bios教程吧!)希望对你有一点用! 对于一个热衷于电脑的用户来说,最大的乐趣就是发觉计算机的潜能,了解计算机的一些技术,计算机的Bios设置对于很多初用电脑人的来说很是深奥,甚至一些计算机的老用户还不了解Bios,因为计算机Bi os涉及了很多计算机内部硬件和性能差数设置,对于一般不懂电脑的人来说有一定的危险性,加之一般Bi os里面都是英文,这个对于英语好的人来说没有问题,但是这毕竟是中国,还有很多人对英语并不是很懂,所以很多人不敢轻易涉足!为了把大家的这些疑惑解决,我利用空闲时间把Bios的设置用图文解释给大家看看,希望能给一部分人一些帮助!但是因为个人知识有限,所以可能其中有一些遗漏或者不正确的解释,请大家一起来探讨指正!谢谢各位的支持! 我找了两种Bios的计算机分别是:华硕的AMI BIOS和升技的AWARD BIOS,这也是目前两种主流的Bios,及算是不同品牌的主板,他们的Bios也是与这两种Bios的功能和设置大同小异,但是一般不同的主板及算是同一品牌的不同型号的主板,他们的Bios又还是有区别的,所以一般不同型号主板的Bios不能通用! 先以华硕的AMI Bios为例,介绍一下AMI Bios的设置: 开启计算机或重新启动计算机后,在屏幕显示如下时,按下“Del”键就可以进入Bios的设置界面 要注意的是,如果按得太晚,计算机将会启动系统,这时只有重新启动计算机了。大家可在开机后立刻按住Delete键直到进入Bios。有些品牌机是按F1进入Bios设置的,这里请大家注意! 进入后,你可以用方向键移动光标选择Bios设置界面上的选项,然后按Enter进入子菜单,用ESC键来返回主单,用PAGE UP和PAGE DOWN键或上下( ↑↓ )方向键来选择具体选项回车键确认选择,F10键保留并退出Bios设置。 接下来就正式进入Bios的设置了! 首先我们会看到(如图2) 一.Main(标准设定)

反汇编基础知识

计算机寄存器分类简介: 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),它们主要用于存放存储单元在段内的偏移量, 用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器 其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。 32位CPU有2个32位通用寄存器EBP和ESP。 它们主要用于访问堆栈内的存储单元,并且规定: EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;

实验二内存操作数及寻址方法

实验二内存操作数及寻址方法 实验目的: 通过实验掌握下列知识: 1、DEBUG命令:G,N,W,L及Q。 2、8088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。 3、8088指令:INC,DEC,LOOP,INT 3,INT 20H,寄存器SI,DI。 4、8088汇编语言伪操作:BYTE PTR,WORD PTR。 5、求累加和程序和多字节加减法程序。 实验内容和步骤: 一、内存操作数及各种寻址方式使用: 内容: MOV AX,1234 MOV [1000],AX MOV BX,1002 MOV BYTE PTR[BX],20 MOV DL,39 INC BX MOV [BX],DL DEC DL MOV SI,3 MOV [BX+SI],DL MOV [BX+SI+1],DL MOV WORD PTR[BX+SI+2],2846 步骤: 1)用A命令键入上述程序,并用T命令逐条运行。

2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。

注意D命令显示结果中右边的ASCII字符及双字节数存放法。 思考:有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。 答:不行。 二、求累加和程序: 程序: MOV BX,1000 MOV CX,10 SUB AX,AX LOP: ADD AL,[BX] ADC AH,0 INC BX J: LOOP LOP INT3 步骤: 1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替。-A 100 2)用命令N AA将此程序命名为文件AA(文件名可任取)。 3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开 始地址) 4)用命令W 100将此程序存到AA命名的磁盘文件中。 5)用命令Q退出DEBUG。 6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序。 若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入。 -U 1477:0100 BB0010 MOV BX,1000 1477:0103 B91000 MOV CX,0010 1477:0106 29C0 SUB AX,AX 1477:0108 0207 ADD AL,[BX] 1477:010A 80D400 ADC AH,00 1477:010D 43 INC BX 1477:010E E2F8 LOOP 0108 1477:0110 CC INT 3 1477:0111 68 DB 68 1477:0112 69 DB 69 1477:0113 7320 JNB 0135 1477:0115 69 DB 69 1477:0116 7320 JNB 0138 1477:0118 61 DB 61 1477:0119 207361 AND [BP+DI+61],D 1477:011C 3400 XOR AL,00 1477:011E 66 DB 66 1477:011F 1421 ADC AL,21 --E1000 1477:1000 34.

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

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

最全面的AMI BIOS设置图解教程

最全面的AMI BIOS设置图解教程 开机显卡自检测完成后,点击<DEL键>即可进入AMI BIOS SETUP设置界面主菜单。 进入了AMI BIOS NEW SETUP UTILITY 设定工具, 屏幕上会显示主菜单。主菜单共提供了十二种设定功能和两种退出选择。用户可通过方向键选择功能项目, 按键可进入子菜单。 默认设置 BIOS setup程序有两种默认的设置:BIOS Setup设置和High Performance Defaults设置。BIOS Setup Defaults设置提供了所有设备和系统的稳定但最小效能的设置。而High Performance Defaults设置提供了最好的系统效能,但有可能导致系统不稳定。 Standard CMOS Features(标准CMOS设定) 使用此菜单可对基本的系统配置进行设定。如时间,日期等。 Advanced BIOS Features( Advanced Chipset Features( Power Management Features( PNP/PCI Configurations Integrated Peripherals PC Health Status Frequency/Voltage Control Set Supervisor Password Set User Password Load High Performance Defaults Load BIOS Setup Defaults Save & Exit Setup Exit Without Saving (不保存退出) 放弃对CMOS的修改,然后退出Setup程序。(保存后退出) 保存对CMOS的修改,然后退出Setup程序。(载入BIOS设定值缺省值) 使用此菜单可以加载主板制造商提供的最小稳定的方式运行设置的一组默认值。(载入高性能缺省值) 使用此菜单可以加载主板制造商提供的为较高的性能优化过的BIOS设定值。(设置用户密码)使用此菜单可以设定用户密码。(设置管理员密码) 使用此菜单可以设定管理员密码。(频率和电压控制) 使用此菜单可以设定管理员/用户密码。(PC基本状态) 此项显示了您PC的当前状态。(整合周边设定) 使用此菜单可以对周边设备进行特别的设定。(PnP/PCI配置) 此项仅在您系统支持PnP/PCI时才有效。电源管理设定) 使用此菜单可以对系统电源管理进行特别的设定。高级芯片组功能设定) 使用此菜单可以修改芯片组寄存器的值,优化系统的性能表现。高级BIOS特性设定) 使用此菜单可对系统的高级特性进行设定。[font=]主菜单 主菜单显示了BIOS所提供的设定项目类别。您可使用方向键( ↑↓ )选择不同的条目。对选定项目的提示信息显示在屏幕的底部。 标准CMOS特性设定 Standard CMOS Features菜单中的项目共分为9个类。每类不包含或包含一个到一个以上的

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):

汇编语言内存操作数及寻址

实验一内存操作数及寻址 通过实验掌握下列知识: 80x86系统中数据在内存中的存放方式和内存操作数寻址方式。 80x86指令: MOV, ADD, SUB, ADC,SBB,INC, DEC, LOOP,CLC 伪指令与操作符: BYTE PTR, WORD PTR,OFFSET,SIZEOF。 简单字符串处理、多字节加减法。 一、内存操作数及各种寻址方式: 阅读下列程序段: ... ... .data wds WORD 1111h, 2222h, 3333h dwds DWORD 6 dup (0CDCDCDCDh) ... ... MOV AX, 1234h MOV EBX, OFFSET wds MOV [EBX], AX MOV BYTE PTR[EBX+2], 20h MOV DL, 39h MOV [EBX+4], DL ADD EBX, SIZEOF wds MOV ESI, 2 DEC DL MOV [EBX+ESI], DL DEC DL MOV [EBX+ESI+1], DL MOV WORD PTR[EBX+ESI+2], 1068h MOV DWORD PTR[EBX+ESI*4], 2846h 1)分析并写出每条指令执行的结果。 2)将程序补充完整,编译、连接后,单步执行,验证分析结果。 3) 说明程序中访问内存操作数的指令所使用的寻址方式,访问的内存地址,以及所访问的内存存储单元位数。 4)有关指令中BYTE PTR、WORD PTR、DWORD PTR伪指令不加会有何结果? 试一试。 二、阅读下列程序段: (指令CLC,Clear Carry Flag :清除进位标志) ...... MOV ECX,4 CLC L1:

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上安装了

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