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

汇编教程

汇编教程
汇编教程

单击菜单文件à新建文件或按快捷键Ctrl+N,在代码编辑窗口中键入如下的代码:(注意大小写敏感)

完成后我把代码保存为F:\backupDoc\test.asm,然后再单击菜单构建。

如果大家还记得的话,就知道这是编译、连接、运行一次搞定的选项,当编译

路径没有配置错误,程序即会进行编译、连接和运行。

至于汇编代码我就不解析了,也不是本教程的范围。如果编译期间发生了错误,则可以在输出窗口中查看错误提示,一般第一次的错误都是没有设置好Masm32的路径。如果没错的话RadAsm会显示整个编译和连接的过程,如上面的程序就输出如下信息:

F:\Asm\masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"F:\Asm\masm32\Include" "F:\backupDoc\test.asm"

Assembling: F:\backupDoc\test.asm

F:\Asm\masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"F:\Asm\masm32\Lib" "F:\backupDoc\test.obj"

Microsoft (R) Incremental Linker Version 5.12.8078

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Executing:

"F:\backupDoc\test.exe"

Make finished.

Total compile time 1693 ms

好了,我们现在打开RadAsm,单击菜单文件——新建工程,在弹出的对话框中设置好工程名和工程的类型,如下图所示:

由于工程类型的选择影响到整个程序的编译和连接,所以大家在选择时不可以随便选一个类型就完事了。下面列出几个常用的工程类型:

1:如果要开发一个带有资源的标准窗口程序,则选择Win32App类型,

假如程序要用到对话框、图标、菜单、快捷键等的话就应该选择这个类型。

2:如果要开发一个没有资源的标准窗口程序,则选择Win32App(No Resource) 类型,一般不用资源的情况很少,但本节用来测试的例子就是一个没有资源的标准窗口程序。

3:如果要开发一个Windows下的控制台程序,则应选择Console APP 。

4:如果只开发一个Dll,则应选择Dll project类型。

设置好后单击“下一步”按钮;现在程序问你是否使用模板,这要看具体做什么程序了,如建立标准窗口程序可以使用“WIN32EXE.tpl”模板,对话框程序可以使用“DialogApp.tpl”模板。当然可以不使用模板,我们现在就这么做,在模板选项中单击“None”选项,然后单击“下一步”按钮。

来到这里我们可以设置需要那些类型的文件和文件夹,当然,“ASM”文件是必选的,其它有用的选项我们在讲解对话框程序时再述。再次单击“下一步”按钮,设置如上图所示。

好了,大家都可以看到工程向导到这里就完成了,单击“完成”按钮吧。

现在工程就建立完成了,是不是很容易?嗯!现在看看开发窗口右边的工程管理器窗口,我

们刚才建立的工程生成了一个“Test.Asm”文件,该文件就是主代码文件了,我们可以双击它来打开代码编辑窗口:

现在把代码粘贴过来,如果格式不好自己再整理一下;考虑到有些朋友手头上暂时没有该例子的代码,没有的朋友可以直接复制下面的文本到RadAsm的代码编辑窗口中:

.const

IDD_DLG_MAIN equ 1000

IDC_EDT_OUTPUT equ 1003

IDC_EDT_FIRST equ 1001

IDC_EDT_SECOND equ 1002

IDC_BTN_OUTPUT equ 1007

IDC_BTN_EXITAPP equ 1008

.data

szExitApp db "你真的要退出程序吗?",0

szTitle db "对话框程序",0

;将两个字符串合并为一个的格式化字符串。

szFormat db "%s%s", 0

hInstance dd ? ;程序实例句柄

.code

DlgProc proc uses ebx esi edi hwnd, uMsg, wParam, lParam

;定义了三个局部数组,类型均为字节型

LOCAL @szBuffer1[256]:byte

LOCAL @szBuffer2[256]:byte

LOCAL @szOutputBuf[512]:byte

mov eax, uMsg

.if eax == WM_INITDIALOG

;这里编写窗口初始化的代码,下面是将三个局部数组清零

invoke RtlZeroMemory, addr @szBuffer1, sizeof @szBuffer1

invoke RtlZeroMemory, addr @szBuffer2, sizeof @szBuffer2

invoke RtlZeroMemory, addr @szOutputBuf, sizeof @szOutputBuf

.elseif eax == WM_COMMAND

mov eax, wParam

.if ax == IDC_EDT_FIRST

;这里编写处理第一个文本框的代码

.elseif ax == IDC_EDT_SECOND

;这里编写处理第二个文本框的代码

.elseif ax == IDC_BTN_OUTPUT

;先获取两个文本框的文本,分别保存在@szBuffer1和@szBuffer2中

;然后通过格式化函数wsprintf将两个文本合并,最后输出到第三个文本框中。

invoke GetDlgItemText, hwnd, IDC_EDT_FIRST, addr @szBuffer1, sizeof @szBuffer1

invoke GetDlgItemText, hwnd, IDC_EDT_SECOND, addr @szBuffer2, sizeof @szBuffer2

invoke wsprintf, addr @szOutputBuf, addr szFormat, addr @szBuffer1, addr @szBuffer2

invoke SetDlgItemText, hwnd, IDC_EDT_OUTPUT, addr @szOutputBuf

.elseif ax == IDC_BTN_EXITAPP

invoke SendMessage, hwnd, WM_CLOSE, 0, 0

.endif

.elseif eax == WM_CLOSE

;这里处理程序退出代码

invoke MessageBox, hwnd, addr szExitApp, addr szTitle, MB_ICONQUESTION or MB_YESNO

.if al == IDYES

invoke EndDialog, hwnd, NULL

.endif

.else

mov eax, FALSE

ret

.endif

mov eax, TRUE

ret

DlgProc endp

;程序入口点

start:

;获取实例句柄

; invoke GetModuleHandle, NULL

mov hInstance, eax

;调用对话框函数来显示对话框。

invoke DialogBoxParam, hInstance, IDD_DLG_MAIN, NULL, offset DlgProc, NULL

invoke ExitProcess, NULL

end start

现在右键单击“Test.Rc”,在弹出的菜单中选择“新建”——“对话框”菜单,如下图所示:

紧跟着会弹出一个要求保存对话框资源文件的对话框,双击“Res”文件夹,我们把对话框资源文件保存在里,在文件名中填上“Test”作为资源文件名。之后程序会自动切换到资源编辑界面,这里就是RadAsm自带的资源编辑界面了,好了,相信大家对这个环境还是比较熟眼的,下面就是添加和修改各控件的属性了,先修改对话框本身吧,设置如下的属性:

对话框属性名

设置值

Name

IDD_DLG_MAIN

Caption

对话框程序

MaxButton

False

Font

Tahoma

StartupPos

CenterScreen

其它的属性默认即可。

接着我们添加三个文本框、三个标签、两个按钮,分别设置如下属性:

文本框1属性名

设置值

Name

IDC_EDT_FIRST

AutoScroll Horizontal

------------------------- 文本框2属性名

设置值

Name

IDC_EDT_SECOND

AutoScroll Horizontal

------------------------- 文本框3属性名

设置值

Name

IDC_EDT_OUTPUT

AutoScroll

Both

MultiLine

True

------------------------- 标签1属性名

设置值

ID

-1

Caption

第一个字符串:

------------------------- 标签2属性名

设置值

ID

-1

Caption

第二个字符串:

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

标签3属性名

设置值

ID

-1

Caption

输出字符串:

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

按钮1属性名

设置值

Name

IDC_BTN_OUTPUT

Caption

输出(&O)

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

按钮2属性名

设置值

Name

IDC_BTN_EXITAPP

Caption

退出(&E)

整个对话框最后设计成下图所示:

如果想预览一下对话框的运行效果可以单击工具栏上的按钮来进行。整个界面设计好后别忘

了保存,直接按“Ctrl+S”就可以。

好了,现在就等着你按下“Alt+F5”了,如果一切顺利的话立即可以看到程序运行,如下图所示:

程序的功能是先获取两个文本框的文本,然后通过单击“输出”按钮来一并输出到第三个文本框中

RadASM使用说明[ 原创]

RadASM使用说明 [ 原创 ]

操作方面:

一、书签:

SHIFT+F8为所在行下书签或删除书签,可通过编辑\书签\开关书签。(CRTL+F8为下一书签,F8为上一书签)

二、列选择:

拉框时用到,CRTL+B为切换行&列拉框。

三、展开 & 关闭模块 & 显示行号:

CRTL+E为展开和关闭模块,在左下脚2 & 3小按钮是展开全部和关闭全部的方式,1是显示行号。

四、显示API的函数原型

当光标碰到一个函数名称时,可显示一个函数的原型,用视图\信息工具打开即可。

五、输出窗口

可通过视图\输出窗口或点击标题栏上的图标即可。

六、全屏显示:

通过CRTL+W切换。

七、锁定文件:

在文件树中,可鼠标右键锁定&解锁文件。

八、新建项目:

当创建一个项目时,可通过向导的倒数第2步会出现“导入”按钮,来导入已有的文件(如图标等),然后在文件组中,右键\导入\文件即可,可通过工程组(右键文件树)对文件进行分类。

九:设置工程的保存位置 & 文件关联

设置工程的保存位置:通过选项\设置路径Projects ,文件关联:在文件夹选项\文件类型选项卡里设置(关联.asm和.rap)

十:断点设置:(程序运行时才会起作用CRTL+SHIFT+F5)

A:在工程选项中把“发行”改成“调试”

B:在文件定义的最后加上include E:\RadASM\Masm\Inc\RADbg.inc

C:ALT+F8为设置&清除断点,通过编辑\断点可全部清除断点D:当断点没有反映时可能是LINK时依赖的资源文件不存在造成的(通过工程选项中可设置LINK)

工程\工程选项:(只推荐几个常用的)

Compile(编译资源文件):4,O,$B/RC.EXE /v /I "$I",1 (4代表最终输出的RES文件名)

Assembly(汇编asm为机器码):3,O,$B\ML.EXE /c /coff /Cp /Zi /nologo /I"$I",2 (3代表最终输出的OBJ文件名)

Link(连接文件并生成PE文件):5,O,$B\LINK.EXE /SUBSYSTEM:WINDOWS /DEBUG /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3,4 (/OUT:"$5"PE文件名)

Run(运行文件):0,0,,5(5代表运行的文件名)

Run w/debug(调试运行):0,0,"$E\OllyDbg",5(5代表调试运行的文件名)

生成PE文件的顺序:

1:Compile(编译资源文件)SHIFT+F5

2:Assembly(汇编asm为机器码) F5

3:Link(连接文件并生成PE文件) SHIFT+ALT+F5

4:Run(运行文件) SHIFT+CRTL+F5

5:Run w/debug(调试运行) CRTL+D

OTHER:

1。选项\设置路径:可设置相应的路径。

2。OllyDbg中可设置OD相关路径:选项\界面选项\目录选项卡。

如何配置RadASM来支持你的编译器

cao_cong

这两天打算配置一下RadASM来支持一下 LCC-Win32 和 Turbo C++ 3.0,虽然以前给 RadASM 配置过支持VC6的Cpp文件,但当时做完就没管了,我这人又比较懒,不愿写东西,导致现在再配置时很多东西都忘了。这次只好又重新研究了一番,费时费力。配置完LCC后真有点筋疲力尽,不管别的了,先把配置的过程写下来,一是以后要用时可以看看,二也希望写出来让大家看了也能对配置编译器的过程清楚一点,可以自己动手来配置RadASM支持自己喜欢的编译器。Turbo C++ 3.0 的配置我已经不太想继续干了,谁有兴趣配置好了的话别忘了给我发一份。

在配置一个编译器之前,首先你要了解你所用的编译器编译、连接、资源编译程序的命令行选项,这样你配置时才能有的放矢。要知道相关程序的命令行选项的话你只需在命令提示符中输入相关程序就可得到。我一般喜欢在后面加一个 /? 参数。如这样:lcc.exe /? 。在控制台窗口中右击鼠标,把显示的命令行选项全选后复制到新建的一个文本文件,以便参考。我这次就以我配置的LCC编译器支持文件来作为模板,对各个部分进行讲解,可能比较罗嗦,主要还是想说清楚一点,让大家少走弯路。有什么说得不对的地方还请大家指正。另外我在配置时RadASM中提到的菜单及选项等都是基于我自己汉化的RadASM来谈的,

如果给你造成了什么歧义的话,还请多多原谅。不浪费大家时间了,下面进入正题:

在开始之前,我把LCC-Win32 的命令行选项列出来(我都翻译过了),以便大家对照:

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

lcc.exe(编译程序) 命令行:

选项含义

-A 激活所有警告.

-ansic 禁用lcc-win32的语言扩展.

-D D后面跟随定义的符号. 例如:-DNODEBUG 定义

NODEBUG 符号. 注意: 在D和符号间没有空格

-check 检查给定源文件的错误. 不生成目标文件.

-E 生成一个中间文件及预处理程序输出.输出文件名将根据输入文件名来生成, 如,编辑 foo.c 你将得到foo.i.

-E+ 类似于 -E 选项, 还会生成一个#行号 xxx 指令,预处理程序生成一个 # xxx 指令.

-EP 类似 -E 选项,但不生成 #行号指令.

-errout= 附加警告/错误信息到指定的文件.如 -errout=Myexe.err.将把所有警告和错误信息附加到Myexe.err 中。

-eN 设置最大错误数N. 例如:-e25.

-fno-inline 忽略内联指令.

-Fo<文件名> 强制输出文件名.

-g2 生成调试信息.

-g3 支持函数堆栈跟踪. 如果遇到一个中断,将显示函数堆栈.

-g4 支持函数堆栈及行号跟踪.

-g5 支持函数堆栈,行号及返回调用堆栈崩溃跟踪.

-I 把一个路径添加到包含的路径,如编译器查找头文件的路径.例:-Ic:\project\headers. 注意在I和后面跟随的路径之间没有空格.

-libcdll 使用用于 lcclibc.dll 的声明.用此选项编译的文件要在连接器 lcclnk 中使用 -dynamic 选项.

-M 在标准输出中显示当处理给定的输入文件时预处理程序打开的所有文件.不生成目标文件.

-M1 在标准输出中递归显示每个 include 文件,指出其调用自何处,何时关闭.

-nw 不显示警告.错误仍将显示.

-O 优化输出. 这将启动 peephole 优化器.

-o <文件>用于给定输出文件的名称.与上面的 Fo 参数相同.

-overflowcheck

生成代码测试所有加,减,乘的溢出.

-p6 启用 Pentium III 指令

-profile 注入代码到已生成的程序中来测试执行时间.此选项不兼容调试级别高于 2 的程序.

-S 生成一个汇编文件. 输出文件名依赖于输入文件.如:编辑 foo.c 你将得到 foo.asm.

-s n 设置转换密度为 n ,值必须在 0.0 和 1.0 之间. 如: -s 0.1

-shadows 当一个本地变量覆盖了一个全局变量时警告.

-stackinit n

函数入口值为 "n" 时初始化未初始化的堆栈.

-U 未定义符号跟随在U后面.

-unused 警告未使用的分配并禁止垃圾代码.

-v 显示编译器版本和编辑日期

-z 生成一个 LCC 中间语言的文件.生成的文件以 .lil 为扩展名.

-Zp[1,2,4,8,16] 设置结构的默认队列为一, 二, 四,等.

如果你设为一,实际上等于无队列.

------------------------------------------------------------------------- 命令行选择区分大小写.使用 "-" 或 "/" 在

命令行中引入选项.

------------------------------------------------------------------------- lcclnk.exe(连接程序) 命令行:

Lcclnk 命令行选项.使用 "-" 或 "/" 在命令行中引入选项.

-o <文件名>

设置输出文件名称.请在 o 和文件名间插入一个空格.

-errout<文件名>

把所有警告/错误信息写入到指定名称的文件.

-subsystem

指出输出文件类型. Console 或 windows 程序

-stack-commit <数字>

选择此选项,你可以提交多于一个的页面(4096 字节).

-stack-reserve <数字>

默认堆栈大小为 1MB. 用此选项改变限制.

-dynamic

使用 lcclibc.dll 作为默认库并动态链接到程序,用以代替连接到 libc.lib.

-dll

此选项告诉连接程序这是一个 .dll 文件而不是一个 .exe 文件.

-map <文件名>

指定 map 文件名.此选项不兼容 -s 选项.

-nolibc

不包括标准 C 程序库.

-s

从程序中去除所有符号和调试信息.

-version nn.nn

为程序添加版本号.

-errout=<文件名>

写入所有警告或错误到给定名称的文件.注意在文件名和等号间没有空格.

-nounderscores

例如创建一个用于 Visual Basic 的 DLL 时,最好 DLL 的输出函数名没有下划线. -entry

设置 DLL 的入口点函数

-version

输出版本名称

------------------------------------------------------------------------- lcclib.exe(编译库(Lib)的工具) 命令行:

格式:

lcclib <目标文件>

选项:

/out:输出文件

/extract:目标

/remove:目标

/verbose: 显示输出过程

默认同名的目标文件将被替换

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

lrc.exe(编译资源脚本的程序) 命令行:

用法: lrc [选项] .RC 输入文件

选项:

/r: 生成 .RES 文件.这是预设好的...

/v: 显示细节(Verbose)

/z: 生成一个 .map 文件.名称依赖于输入文件

/d: 定义符号

/o: 输出到指定文件.

'o' 和文件名间没有空格

/fo: 输出到指定文件.

'o' 和文件名间没有空格

/l: 默认语言号

后面应立即跟随十进制的语言号.'l'和语言号之间没有空格

/i: 添加一个 include 路径.

'i'和路径间没有空格

/a: 写打包文件(图标,位图, 等等)

选项不区分大小写

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

配置一个让RadASM支持的编译器只需写一个INI文件,把各个段配置好。配置好后放在RadASM目录,直接在RadASM的菜单选项->编程语言中把你的配置文件添加进去就可以了。我这里把配置的文件命名为Lcc.ini,我把每个段都列出来(列主要我们要配置的部分),各个段的含义我在每个列出的段后用“//”开头的注释说明。

[Description]

1=Lcc Win32

//这个段是对你配置的编译器描述,你可以随便写。

[Enviroment]

1=path,C:\Lcc\Bin;

//这相当于环境变量,RadASM会到path后面指定的路径查找相关程序。

[CharTab]

2=0251222522222236;20-2F

3=1111111111222221;30-3F

//字符表定义,0到127的默认字符表,与我们没多少关系,随便在RadASM中找一个配置好的编译器支持文件复制过来就行了。

[Open]

0="C++ 文件 (*.c;*.cpp;*.h),*.c;*.cpp;*.h"

1="资源文件 (*.rc),*.rc"

2="文本文件 (*.txt),*.txt"

3="宏文件 (*.dsm),*.dsm"

4="所有文件 (*.*),*.*"

src="C++ 文件 (*.cpp),*.cpp,cpp"

hdr="头文件 (*.h),*.h,h"

mod="模块 (*.cpp),*.cpp,cpp"

//工程中默认打开的文件类型列表,根据你的编译器源文件类型进行修改。

[CodeMacro]

;关键字,活动行前插入,活动行后插入

;{I}=从关键字行复制缩进

;{C}=回车符

;{S}=空格符

;{T}=制表符

;{$}=复制 Proc/Struct 名称

;宏的设置默认已开启自动缩进

1=if(),{{C}{T},{C}{I}}

2=else,{T},

3=elseif,{T},

4=while,{T},{C}{I}

;5=

6=$ ),{{C}{I}{T},{C}{I}}

7=struct $,{T},{C}{I}}

8=for(),{{C}{T},{C}{I}}

9={,{T},{C}{I}}

;10=

//这个段称之为代码宏,就是当你在RadASM的编辑器中输入代码时根据你的输入自动完成的内容。“;”后为注释,我翻译了一下。我们选1=if(),{{C}{T},{C}{I}}这条来讲解一下其含义:1是序号,不用多说,if(),{{C}{T},{C}{I}}是指当我在编辑器中输入if()回车后,首先在第二行开始输出一个“{”再自动回车到下一行开始输出一个制表符,再回车到第四行把第一行的if()开始位置复制过来,后面跟一个“}”,光标的位置定位在第二行的制表符后。实际效果如下:

if()

{

//光标位置

}

if(),{{C}{T},{C}{I}}中if()是指自动完成时的关键字,紧跟在逗号后的{{C}{T}指在活动光标前插入的字符,最后的{C}{I}}是指在活动光标后插入的字符。在这个段中的{$}是用来复制函数或结构名称的。我

在6=$ ),{{C}{I}{T},{C}{I}}中配置的$ )是希望我输入一个函数并加 )后能自动给我完成的,可惜好象工作的不好,只对汇编的编译器有效。

[Code]

ParseDll=CppParse.dll

Skip=

Code=

Const=

Data=

Macro=

Struct=

Label=

//这个段功能是用于查找并获取代码属性的。对汇编语言支持比较好。举个masm里的例子:Code=? endp,$ proc意思是指识别为代码时检测任意名称命名的 proc,结束为 endp。例如:

test proc

...

endp

在masm工程中就会把此部分识别为代码。

[CodeBlock]

1={,},,,0

2=

3=

4=

5=

6=

7=

8=

9=

10=

11=

12=

13=

14=

15=

//代码块,用于标记可折叠的代码块。如1={,},,,0是指开始为“{”结束为“}”的就标记为代码块,将会自动在第一个开始的 { 那放一个可折叠的标记。后面各个逗号中选项大家可以参考帮助文件。最后的那个0是标志位。

[Api]

Trig=

Call=Masm\masmApiCall.api

Const=Masm\masmApiConst.api

Struct=Masm\masmApiStruct.api

Word=Cpp\cppWord.api

Message=Masm\masmMessage.api

Type=Cpp\cppType.api

inc=#include,","

lib=

//这是代码书写助手(Code write helpers)的功能。在你写代码时自动列出函数及在工具栏上显示函数。根据情况定义各个文件。

[Edit]

CodeFiles=.c.cpp.h.rc.tpl.rad.def.api.nsi.dsm.

//这个段是配置编辑环境的,可在RadASM的选项中直接配置,我不全列出来了。基本上可以找个配置好的编译器文件照抄。主要注意上面的这条,这是你的编译器要使用的文件。

[Dialog]

...

//这是对话框编辑器中的选项,可以在选项中设置。照抄别的。

[Error]

BookMark=3

nAsm=99

Identify=Error

Skip=2

//根据作者给我的最新的2.2.0.6版本中的解释,各个关键词的含义如下:

BookMark=3

//这句对应2.2.0.6版本中代码编辑器选项中新增加的编译器错误处理部分的内容。可在选项中设置。

nAsm=99

//这句是指定编译器的。仅当不在 [Code] 段中具体设置编译器时才需考虑。各个含义如下:

MASM=1

TASM=2

FASM=3

GOASM=4

NASM=5

HLA=6

CPP=7

BCET=8

其他编译器=99

如果我们要配置新的非以上类型的编译器的话,就应设成象上面一样:nAsm=99

Identify=Error

//这句是指错误的关键字是什么。

Skip=2

//这句是指在输出窗口中发现了在 Identify 中指定的关键字内容后,在文件名前跳过的单词个数。如象下面这样的错误:

Error E2378 test.cpp 26: Return statement missing ; ……

就会跳过前面的 Error 和 E2378 这两个词后定位到文件名上。这样 RadASM 就能正确跳到出错行了。

[Paths]

$A=C:\Lcc

$B=$A\Bin

$D=$R\AddIns

$H=masm32\Help

$I=$A\Include

$L=$A\Lib

$P=$R\Lcc\Projects

$S=$R\Lcc\Sniplets

$T=$R\Lcc\Templates

$M=$R\Lcc\Macro

$E=C:\Ollydbg

//这个段是路径设置,各个标志与设置路径选项中对应为:$A->App:,编译器的安装路径;$B->Bin:,编译、连接、资源编译等程序的路径。其它的我就不讲了,比较简单。只是注意$R是指RadASM的安装路径。如你的RadASM安装在E:\RadASM,$R就指这个目录。这些标志可在下面的工程配置中使用。

[MakeFiles]

0=.rap

1=.rc

2=.cpp

3=.obj

4=.res

5=.exe

6=.def

7=.dll

8=.txt

9=.lib

10=.mak

11=.c

12=.com

13=.ocx

14=.idl

15=.tlb

//这个段是用于在创建工程时每个工程中所包含的文件类型。记住上面各个序号对应的文件类型,后面要用到。

[Project]

Type=Win32 App,Console App,Dll Project,Ocx Project,LIB Project,Win32 App (no res),Dll Project (no res),Ocx Project (no res)

Files=cpp,h,Rc,Def,Txt,Mak,dsm,idl

Folders=Bak,Mod,Res

MenuMake=编译资源脚本,编译,连接,构建,构建并运行,运行,在调试器中运行,全部构建并运行,编译模块Group=1

GroupExpand=1

//终于接近最关键的部分了。这个段是设置你的编译器所支持的编译程序类型等。在Type后面定义的是工程类型,名字将作为下面每个具体工程配置段的关键字。Files后面是指工程中所用到的文件类型,用扩展名表示。Folders后面是指出建立工程时在新建的工程目录下有哪些子目录可用。Bak目录用于备份你的每次修改;Mod目录我不太清楚,大概是用于模块(module)的目录,基本没选过这个目录。Res目录是用来保存你的资源文件的。MenuMake后面是指在RadASM构建菜单下的子菜单中显示的项目。后面的Group和GroupExpand是用来定义工程组的,照抄就行了。

[MakeDefNoProject]

MenuMake=1,1,1,1,1,1,1,0,0

1=rsrc.res,O,$D\RC.EXE /v,rsrc.rc

2=$.obj,O,$B\LCC.EXE /O /unused /c /errout=error.txt /I"$I",$.cpp

3=$.exe,O,$B\LCCLNK.EXE /s /SUBSYSTEM WINDOWS,$.obj,$.res

4=0,0,,$.exe

5=rsrc.obj,O,$D\CVTRES.EXE,rsrc.res

6=*.obj,O,$B\LCC.EXE /O /unused /c /errout=error.txt /I"$I",*.cpp

7=0,0,"$E\OllyDbg",$.exe

11=rsrc.res,O,$D\RC.EXE /v,rsrc.rc

12=$.obj,O,$B\LCC.EXE /g2 /O /unused /c /errout=error.txt /I"$I",$.cpp

13=$.exe,O,$B\LCCLNK.EXE /SUBSYSTEM WINDOWS,$.obj,$.res

14=0,0,,$.exe

15=rsrc.obj,O,$D\CVTRES.EXE,rsrc.res

16=*.obj,O,$B\LCC.EXE /g2 /O /unused /c /errout=error.txt /I"$I",*.cpp

17=0,0,"$E\OllyDbg",$.exe

//这里是默认设置,就是你不在RadASM中建立工程,只用RadASM打开源文件执行编译时的配置。这里和下面一段可说是最重要的部分了,请注意看,我一条条的讲解,尽量说的清楚点。先说一下可能用到的几个特殊字符的含义:

$:从RadASM编辑器的最顶部标题栏中获取的不带扩展名的文件名。如打开test工程下的名为test.cpp 的文件,这里的$就相当于test,就等于你不带扩展名的文件名称。下面会详细说明。

|:这个符号将在实际编译工程时替换为“,”(逗号)。如$D\RC.EXE /v,rsrc.rc|test.rc 实际编译时就会

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用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/8716026456.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毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩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

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/8716026456.html,/file/f61cb107c8 001第一章- 基础知识01 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6806f45b8 002第一章- 基础知识02 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6ec42d4d3 003第一章- 基础知识03 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6deb05ec4 004第一章-基础知识04 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6e51f6838 005第一章- 基础知识05 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f66edaf8d3 006第二章- 寄存器(CPU工作原理)01 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6d07e07b9 007第二章- 寄存器(CPU工作原理)02 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6d7f585a8 008第二章- 寄存器(CPU工作原理)03 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f639d8b3cf 009第二章- 寄存器(CPU工作原理)04 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6dcadbde6 010第二章- 寄存器(CPU工作原理)05 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6ea3f01c1 011第二章- 寄存器(CPU工作原理)06 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f65b96a06f 012第二章- 寄存器(CPU工作原理)07 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f682da085a 013第三章- 寄存器(内存访问)01 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6486e698 014第三章- 寄存器(内存访问)02 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6b7491d9f 015第三章- 寄存器(内存访问)03 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f622b7f9a7 016第三章- 寄存器(内存访问)04 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f64e2424b9 017第三章- 寄存器(内存访问)05 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6e5132d4d 018第三章- 寄存器(内存访问)06 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f655c10e86 019第三章- 寄存器(内存访问)07 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6b22e64e6 020第四章- 第一个程序01 下载地址:https://www.doczj.com/doc/8716026456.html,/file/f6812126a4

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

汇编语言入门教程

汇编语言入门教程 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位立即数。

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 ;返回主程序

汇编语言基础知识

汇编语言基础知识 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有 效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel 公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。 1.1 微型计算机概述 微型计算机由中央处理器(Central Processing Unit ,CPU )、存储器、输入输出接口电路和总线构成。CPU 如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键指标。存储器包括随机存储器(Random Access Memory ,RAM )和只读存储器(Read Only Memory ,ROM )。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU 和其他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本结构。 外部设备存储器输入输出接口电路中央处理器 CPU 地址总线 数据总线 控制总线 图1.1 微型计算机基本结构 特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变 为各个部件面向总线的单一关系。一个部件只要符合总线结构标准, 就可以连接到采用这种总线结构的系统中,使系统功能得到扩展。 数据总线用来在CPU 与内存或其他部件之间进行数据传送。它是双向的,数据总线 的位宽决定了CPU 和外界的数据传送速度,8位数据总线一次可传送一个8位二进制数据(即一个字节),16位数据总线一次可传送两个字节。在微型计算机中,数据的含义是广义的,数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。 地址总线专门用来传送地址信息,它是单向的,地址总线的位数决定了 CPU 可以直接寻址的内存范围。如 CPU 的地址总线的宽度为N ,则CPU 最多可以寻找2N 个内存单 元。

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

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),它们主要用于存放存储单元在段内的偏移量,

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