论坛: 编程破解 标题: 翻译:Windows汇编语言编程指南[全部翻译完毕并提供在线浏览和下载] 复制本贴地址    
作者: 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号