|
![]() | 作者: jhkdiy [jhkdiy]
![]() |
登录 |
Windows Assembly Programming Tutorial Windows 汇编语言编程指南 作者:Jeff Huang. 译者:jhkdiy 译期:2006-6-11 邮箱:jhkdiy_gzb@21cn.net 潜水论坛:www.20cn.net 源教程版本:1.02 -2003年 译注:自己还是第一次翻译16页的英文教程。全部翻译完了,给我的感觉就是这篇文章是为已有汇编基础但从未接触过Windows汇编编程的读者写的,虽然对我来说这些内容很简单,但也觉得说的很详细了,好过国内许多三言两语的所谓菜鸟教程;但如果读者想全面学习Win32汇编编程的话还是非Iczelion的Win32汇编教程莫属,网上到处都有中文和原文下载。虽然自己不敢说百分百明白原文,但也有98了,剩下的两点留给各位读者给我反馈,英文好的完全可以阅读源文,在此就不多说了,继续看下去吧。 jhkdiy 06年6月25日 目录: 简介................................................................ 2 为什么选择汇编语言? .................................... 2 为什么选择Windows? .................................... 2 I. 开始学习 ................................................... 3 编译器 .......................................................... 3 编辑器............................................................ 3 II. 你的第一个程序 ....................................... 4 控制台版本..................................................... 4 Windows版本 ............................................... 6 ADDR vs OFFSET........................................................ 6 III. 汇编基础 ................................................. 7 CPU 寄存器 ................................................. 7 基本的指令集 ................................................ 8 Push 和 Pop .................................................. 8 Invoke ........................................................... 9 示例程序 ....................................................... 9 IV. Windows基础........................................... 10 预备 ............................................................. 10 宏 .................................................................10 函数 ............................................................. 10 变量 .............................................................10 一个简单的窗口.............................................. 11 V. 进一步学习汇编和Windows....................... 13 字符串处理 .................................................... 13 文件管理 ....................................................... 13 内存............................................................. 14 示例程序 .................................................... 14 控件................................................................ 15 附加资源 ....................................................... 16 [URL=http://WWW..................................................................... ]WWW..................................................................... [/URL] 16 书籍 ............................................................................. 16 MASM32 ...................................................................... 16 MSDN Library ................................................................ 16 新闻组................................................................ 16 IRC................................................................. 16 因该网站使用了防止盗链技术,请下载文件的朋友使用下载工具进行下载,切勿使用右键另存为 在线浏览: http://jhkdiy.go3.icpcn.com/file/article/Windows%20Assembly%20Programming%20Tutorial.htm 下载原文和译文: http://jhkdiy.go3.icpcn.com/code/download/Windows%20Assembly%20Programming.rar [此贴被 jhkdiy(jhkdiy) 在 06月25日16时53分 编辑过] |
地主 发表时间: 06-06-12 00:20 |
![]() | 回复: FunnyBoy2005 [daviyang35] ![]() |
登录 |
谢谢了 要是可以下就好了! 请快点啊!好期待哦 ![]() |
B1层 发表时间: 06-06-13 11:54 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
需要英文教程的朋友可以留下邮箱地址。 |
B2层 发表时间: 06-06-14 17:25 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
qiuqiongzhi@163.com给我发份,有时间还是得学些其他东西了。 兄弟不用上班么??还有时间翻译。英语肯定不错了。 |
B3层 发表时间: 06-06-21 13:35 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
我还是学生,等我考完试就尽快把它翻译完,源文件在我家里,明天发给你. |
B4层 发表时间: 06-06-21 16:51 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
哈哈。几年级的?? 俺正好毕业。。 |
B5层 发表时间: 06-06-21 17:58 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
9月份大三了,教程已发送,请验收。 |
B6层 发表时间: 06-06-22 13:52 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
谢谢。 才大三。还有好多时间学习啊。。 |
B7层 发表时间: 06-06-22 18:42 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
III. 汇编基础 现在,我们已经可以编写一个简单可程序并让它运行起来。让我们再移到本教程的核心部分-基本的汇编语法。为了使你能编写自己的汇编程序,这些知识是你必须掌握的。 CPU 寄存器 寄存器是CPU内部的特殊存贮器。在这点上,我们假定读者是使用386或更高级的CPU进行编程。老式的处理器在现在已经很稀罕了,所以学习它们反而会浪费时间。旧式和新式处理器的一个重要区别在于386之前的CPU都是16位的,而并不是32位。 386有8个32位的常规目的寄存器。首先4个 eax、ebx、ecx和edx能使用16位或8位的名称进行访问。例如ax能获取eax的前16位,al获取低8位,ah获取9至16位。其它寄存器也能使用相似的方式进行访问。按理说,这些寄存器能做任何事情,但它们大多数都有一个特殊用途: 地址 名称 描述 EAX* 累加器 计算操作数和存放结果数据 EBX 基础寄存器 指向DS数据段的数据指针 ECX* 计数寄存器 字符串和循环操作的计数器 EDX* 数据寄存器 输入/输出指针 ESI 源索引 字符串操作的源地址指针 EDI 目的索引 字符串操作的目的地址指针 ESP 栈指针 栈指针,不能直接使用 EBP 基址指针 栈的数据指针 注意:尽管它们被称为通用寄存器,但只有标了‘*’号的寄存器能在Windows编程中通用。 6个16位的段寄存器, 他们定义内存中的段: 地址 名称 描述 CS 代码段 存储指令和执行的地方 DS, ES, FS, GS 数据段 数据段 SS 堆栈段 当前程序存储堆栈的地方 最后,有两个32位的不属于任何种类的寄存器: 地址 名称 描述 EFLAGS 代码段 状态、控制和系统标志 EIP 指令指针 下一条将要执行指令的地址 基本指令集 X86指令非常多,但我们通常都无需全部用到。下面的一些简单指令是你一开始就要掌握的: 指令 描述 ADD* reg/memory, reg/memory/constant 将两个操作数作加法运算,并将结果存入到第一个操作数,如果有进位则会设置CF标志。 SUB* reg/memory, reg/memory/constant 从第一个操作数中减去第二个操作数,并将结果存入到第一个操作数中 AND* reg/memory, reg/memory/constant 在操作数之间执行逻辑位与运算,并将结果存入到第一个操作数中 OR* reg/memory, reg/memory/constant 在操作数之间执行逻辑位或运算,并将结果存入到第一个操作数中 XOR* reg/memory, reg/memory/constant 在操作数之间执行逻辑位异或运算,并将结果存入到第一个操作数中。注意不能XOR两个内存操作数。 MUL reg/memory 将操作数与累加器(eax)相乘,并将结果存入累加器 DIV reg/memory 从累加器中除以操作数,并将结果存入累加器 INC reg/memory 将操作数的值增1,并将结果存回到操作数中 DEC reg/memory 将操作数的值减1,并将结果存回到操作数中 NEG reg/memory 将操作数的值取反,并将结果存回到操作数中 NOT reg/memory 将操作数执行逻辑位求反,并将结果存回到操作数中 PUSH reg/memory/constant 将操作数的值压入栈顶 POP reg/memory 将栈顶的一项值弹出到操作数中 MOV* reg/memory, reg/memory/constant 将第二个操作数存入到第一个操作数中 CMP* reg/memory, reg/memory/constant 第一个操作数减去第二个操作数,并设置分辨标志,通常与JMP、rep等条件跳转联用。 JMP** label 跳转到label中 LEA reg, memory 获取第二个操作数的偏移地址,并将结果存入到第一个操作数中。 CALL subroutine 调用另一个过程并直到该过程返回才会离开该过程的控制 RET 返回到调用者中 INT constant 调用指定的中断 * 表示指令中的操作数不能同时为内存操作数 ** 该指令能与条件联用,例如:JNB(not below)仅当CF=0时跳转。 能在下列链接中获取最新的完整指令集参考: http://www.intel.com/design/pentium4/manuals/index.htm. Push 和 Pop Push 和 pop是用来操纵栈的,Push获取一个值并将它加到栈的顶部,Pop从栈顶获取一个值,然后将该值从栈顶删除,并将该值存入到指定的操作数中。因此,栈使用了一个叫后进先出(LIFO)的方法。栈是计算机中的公共数据结构,所以如果你不适应栈工作的话我建议你学一下这方面的内容。 Invoke Invoke函数是MASM特有的,并使得无须预先压入参数就可以调用函数。这样可以节省我们许多的输入。 例如: invoke SendMessage, [hWnd], WM_CLOSE, 0, 0 来自: push 0 push 0 push WM_CLOSE push [hWnd] call [SendMessage] 示例程序 这里有个展示如何使用一些指令和寄存器的完整程序,如果你能领会到就明白它们的操作了。 注意:‘;’字符表示注释,该字符后面的任何文本都不会被编译,在注释里添加能使你的代码更加易读的提示或注解是个好习惯。 .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data ProgramText db "Hello World!", 0 BadText db "Error: Sum is incorrect value", 0 GoodText db "Excellent! Sum is 6", 0 Sum sdword 0 .code start: ; eax mov ecx, 6 ; set the counter to 6 ? xor eax, eax ; set eax to 0 0 _label: add eax, ecx ; add the numbers ? dec ecx ; from 0 to 6 ? jnz _label ; 21 mov edx, 7 ; 21 mul edx ; multiply by 7 147 push eax ; pushes eax into the stack pop Sum ; pops eax and places it in Sum cmp Sum, 147 ; compares Sum to 147 jz _good ; if they are equal, go to _good _bad: invoke StdOut, addr BadText jmp _quit _good: invoke StdOut, addr GoodText _quit: invoke ExitProcess, 0 end start |
B8层 发表时间: 06-06-23 17:05 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
英语多少级了??不错不错。。好青年。哈哈。 |
B9层 发表时间: 06-06-24 13:14 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
真不满你说,4级没过! |
B10层 发表时间: 06-06-24 15:47 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
![]() ![]() ![]() 四级都过不了?那东西我已经两年没碰了,报了两次六级(那时候女朋友强迫我报的),结果每次都没时间去参加考虑,其实英语嘛,你能使用就行了。不一定要什么证书的。 |
B11层 发表时间: 06-06-25 12:35 |
![]() | 回复: guawoo [guawoo] ![]() |
登录 |
强呀。。。。楼主辛苦了。。 这个东东一定要收藏 |
B12层 发表时间: 06-07-12 09:05 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
继续啊..现在放假了吧.. |
B13层 发表时间: 06-07-19 13:26 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
是有在翻译,不过这次内容比较多,原文有42页,而且英语也比较难懂。该文也是出自汇编大师Randall Hyde之手。也就是《Art of Assembly Language》的作者。原文的题目是 《Style Guidelines for Assembly Language Programmers》 我将它翻译为: 《汇编程序员之代码风格指南》 现在只翻译了十多页,如果大家想尽快看到该文的话就要多给鼓励哦! ![]() ![]() ![]() ![]() ![]() |
B14层 发表时间: 06-07-19 15:12 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
不错..翻译完了后整理下做个CHM.哈哈 够你累的. |
B15层 发表时间: 06-07-19 19:25 |
![]() | 回复: dd [dd] ![]() |
登录 |
加油。。。。我也要一份哦。 jas1986@sohu.com |
B16层 发表时间: 06-07-20 17:06 |
![]() | 回复: battle [battle] ![]() |
登录 |
jk_king@163.com 谢谢啊 |
B17层 发表时间: 06-07-31 09:20 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
有空帮我把1173页的C#书也翻译下???![]() ![]() 辛苦了. |
B18层 发表时间: 06-08-01 18:42 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
TO:NetFog![]() ![]() ![]() ![]() |
B19层 发表时间: 06-08-01 19:49 |
![]() | 回复: NetFog [q70213526] ![]() |
登录 |
![]() ![]() ![]() 还是好好学吧..郁闷..工作不好搞.. |
B20层 发表时间: 06-08-02 08:32 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号