Windows X86-64位汇编语言入门

合集下载

简明X86汇编语言教程

简明X86汇编语言教程
对于 EAX、AX、AH、AL 的改变同时也会影响与被修改的那些寄存器的值。从而事实上只存在 一个 32-bit 的寄存器 EAX,而它可以通过 4 种不同的途径访问。
也许通过名字能够更容易地理解这些寄存器之间的关系。EAX 中的 E 的意思是“扩展的”,整 个 EAX 的意思是扩展的 AX。X 的意思 Intel 没有明示,我个人认为表示它是一个可变的量 。 而 AH、AL 中的 H 和 L 分别代表高和低 。
32-bit 宽 意的数值,但通常没有人把它当作通用寄存器来用。DS 是默认段寄存器或选
择器。
EBP 这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧’
来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望
32-bit 宽
的任何数据。SS 是它的默认段寄存器或选择器。
典型的处理器的主要任务包括
从内存中获取机器语言指令,译码,执行 根据指令代码管理它自己的寄存器 根据指令或自己的的需要修改内存的内容 响应其他硬件的中断请求
一般说来,处理器拥有对整个系统的所有总线的控制权。对于 Intel 平台而言,处理器拥有对数 据、内存和控制总线的控制权,根据指令控制整个计算机的运行。在以后的章节中,我们还将讨 论系统中同时存在多个处理器的情况。
每种计算机都有自己的汇编语言——没必要指望汇编语言的可移植性,选择汇编,意味着选择性 能而不是可移植或便于调试。这份文档中讲述的是 x86 汇编语言,此后的“汇编语言”一词,如 果不明示则表示 ia32 上的 x86 汇编语言。
汇编语言是一种易学,却很难精通的语言。回想当年,我从初学汇编到写出第一个可运行的程 序,只用了不到 4 个小时;然而直到今天,我仍然不敢说自己精通它。编写快速、高效、并且能 够让处理器“很舒服地执行”的程序是一件很困难的事情,如果利用业余时间学习,通常需要 2-3 年的时间才能做到。这份教材并不期待能够教给你大量的汇编语言技巧。对于读者来说,x86 汇编语言"就在这里"。然而,不要僵化地局限于这份教材讲述的内容,因为它只能告诉你汇编语 言是“这样一回事”。学好汇编语言,更多的要靠一个人的创造力于悟性,我可以告诉你我所知 道的技巧,但肯定这是不够的。一位对我的编程生涯产生过重要影响的人曾经对我说过这么一句 话:

汇编语言基于x86处理器

汇编语言基于x86处理器

汇编语言基于x86处理器汇编语言是一种低级编程语言,它直接操作计算机硬件进行指令级编程。

在x86架构下,汇编语言主要用于编写操作系统、驱动程序以及底层的系统软件。

以下是一些关于x86汇编语言的参考内容:1. x86处理器的架构和特点:x86处理器系列有很多型号和版本,比如Intel的Pentium和Core系列、AMD的Athlon和Ryzen系列等。

了解每种型号处理器的架构和特点对于编写高效的汇编程序非常重要。

2. 汇编语言的基本语法:汇编语言是一种低级语言,它使用汇编指令来直接操作计算机硬件。

了解汇编语言的基本语法,包括寄存器、指令和操作码等内容,是编写汇编程序的基础。

3. 寄存器和内存:在x86汇编语言中,寄存器是非常重要的概念。

了解常用的寄存器,如通用寄存器、段寄存器以及标志寄存器,以及寄存器的使用方法和操作规则,在编写汇编程序时能够更加灵活地使用寄存器。

4. 指令集和操作码:x86处理器支持的指令集非常丰富,包括算术和逻辑指令、数据传输指令、控制指令等。

了解常用的指令集和操作码,以及它们的使用方法和功能,是编写汇编程序的基础。

5. 汇编程序的编写和调试:了解如何编写和调试汇编程序,包括使用汇编器将汇编代码转换为机器码、使用调试器进行程序的调试和内存的查看等。

学习汇编程序的编写和调试技巧,能够更加高效地完成汇编程序的开发和调试任务。

6. 汇编程序的优化:汇编语言可以直接操作硬件,因此在一些对性能要求较高的场景,使用汇编语言编写程序可以实现更高效的代码。

了解汇编程序的编译器优化和硬件优化方法,可以提高汇编程序的执行效率。

7. 汇编语言应用案例:了解汇编语言在实际项目中的应用案例,包括操作系统、驱动程序、嵌入式系统等。

通过学习实际应用案例,能够更好地理解汇编语言在底层系统软件开发中的重要性。

总之,汇编语言是一种低级编程语言,基于x86处理器的汇编语言编程需要了解x86处理器的架构和特点,掌握汇编语言的基本语法、指令集和操作码,熟悉寄存器和内存的使用方法,以及编写和调试汇编程序的技巧。

Windows X86 64位汇编语言入门

Windows X86 64位汇编语言入门

Windows X86-64位汇编语言入门Windows X64汇编入门(1)最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。

我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。

文章的标题包含了本文的四方面主要内容:(1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista64位版,调用的均为windows API。

(2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。

至于三者间的区别,可自行搜索。

(3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。

(4)入门:既是入门,便不会很全。

其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。

其二,便于类似我这样刚接触x64汇编的新手入门。

本文所有代码的调试环境:Windows Vista x64,Intel Core2Duo。

1.建立开发环境1.1编译器的选择对应于不同的x64汇编工具,开发环境也有所不同。

最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio2005一起发布。

因此,如果你是微软的忠实fans,直接安装VS2005既可。

运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。

它的最大好外是小,不用为了学习64位汇编安装几个G的VS。

因此,本文的代码就在GoASM下编译。

第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。

不同的编译器,语法会有一定差别,这在下面再说。

1.2IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。

Windows X64汇编入门(1)

Windows X64汇编入门(1)

Windows X64汇编入门(1)tankaiha最近断断续续接触了些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进行编译了。

1.jpg下载此附件需要消耗2Kx,下载中会自动扣除。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。

它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。

因此,本文的代码就在GoASM下编译。

第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。

不同的编译器,语法会有一定差别,这在下面再说。

1.2 IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。

X64汇编

X64汇编

64位汇编语言简介现在已经是64位的时代了,x86-64(AMD64)平台将是下一代计算机的体系结构,我们开发操作系统的当然要对x86-64的汇编有所了解。

1.x86-64的寄存器x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是:rax,rbx,rcx,rdx,rsi,rdi,rsp,rbpr8,r9,r10,r11,r12,r13,r14,r15同时,x86-64全面支持x86-32和x86-16的通用寄存器:eax,ax,al,ah,ebx,bx,bl,bh,....而且,还对传统的edi,esi做了改进:edi ,32位di,16位dil ,8位,在传统的x86机器中,di是不可按照8位来访问的,但在x86-64下可以。

同样esi也可以按照8位来访问。

一个很特别的寄存器rip,相当于x86-32的eip.在x86-32是不可直接访问的,如mov eax,eip是错的,但在x86-64位下却可以,如mov,rax,qword ptr [rip+100]是对的。

而且,它除了是个程序计数器外,也是个“数据基地址”,有此可见,它现在是身兼两职!为什么在x86-64位下要用rip做访问数据的基地址呢?因为,在x86-64下,DS,ES,CS,SS都没有实际意义了,也就是说,它们不再参与地址计算,只是为了兼容x86-32。

FS,GS还是参与地址计算,它们两个和x86-32的意义相同。

8位:al,ah16位:ax32位:eax64位:rax 新增(r8-r15寄存器,低32位r8d-r15d,低16位r8w-r15w,低8位r8b-r15b)2.x86-64的汇编x86-64的汇编和x86-32的没有多大的区别。

添加了新寄存器和指令。

操作符标示:8位:b16位:w32位:l64位:q写64位汇编代码时,可以用8、16、32、64位寄存器,如:push rdisub rsp, 48 ;mov r10, rcx; Line 36mov rdi, rdxxor eax, eaxmov ecx, 512rep stosb; Line 43movsxd r8, DWORD PTR [r10+16]mov QWORD PTR [rsp+32], rdxmov r9, QWORD PTR [r10+648]mov rdx, QWORD PTR [r10+52]mov rcx, QWORD PTR [r10+44]call fs_read_disk; Line 47mov ecx, 1cmp eax, ecxcmovne ecx, eaxmov eax, ecx; Line 52add rsp, 48pop rdiret 0再如:$L1818:; Line 2398mov al, BYTE PTR [rdx+rbx] cmp al, 32jne SHORT $L1819mov BYTE PTR [rdx+rbx], 0 $L1819:add r8d, 1movsxd rdx, r8dxor eax, eaxmov rcx, r12mov rdi, rbxrepne scasbnot rcxsub rcx, 1cmp rdx, rcxjb SHORT $L1818但,有点值得注意,当操作传统的32位寄存器时,那么,整个64位寄存器都会受到影响,如:mov eax,0ah那么,rax也等于000000000000000ah再如:mov rcx,0aaaaaaaaaaaaaaaah(此时ecx等于0aaaaaaaah)mov ecx,0ddddddddh(此时,rcx等于00000000ddddddddh,高32位受到了影响).规则:Example 1: 64-bit Add:Before:RAX =0002_0001_8000_2201RBX =0002_0002_0123_3301ADD RBX,RAX ;48 is a REX prefix for size.Result:RBX = 0004_0003_8123_5502Example 2: 32-bit Add:Before:RAX = 0002_0001_8000_2201 RBX = 0002_0002_0123_3301ADD EBX,EAX ;32-bit addResult:RBX = 0000_0000_8123_5502 (32-bit result is zero extended)Example 3: 16-bit Add:Before:RAX = 0002_0001_8000_2201 RBX = 0002_0002_0123_3301ADD BX,AX ;66 is 16-bit size override Result:RBX = 0002_0002_0123_5502 (bits 63:16 are preserved)Example 4: 8-bit Add:Before:RAX = 0002_0001_8000_2201 RBX = 0002_0002_0123_3301ADD BL,AL ;8-bit addResult:RBX = 0002_0002_0123_3302 (bits 63:08 are preserved)3.总结当然,这里说的都是最基本的东西,是针对通用寄存器言的。

汇编语言的学习步骤

汇编语言的学习步骤

汇编语言的学习步骤汇编语言作为低级语言的一种,是计算机硬件与高级编程语言之间的桥梁。

学习汇编语言可以帮助我们更深入地理解计算机底层的工作原理,提升编程的效率与质量。

下面是学习汇编语言的步骤,希望对你有所帮助。

Step 1:了解计算机体系结构在学习汇编语言之前,了解计算机的体系结构是非常重要的。

学习者需要了解计算机的组成部分,包括处理器、内存、输入输出设备以及其他外围设备。

掌握各组件之间的工作原理和相互关系,可以帮助我们理解汇编语言的运行机制。

Step 2:选取适合的汇编语言在市场上有多种不同的汇编语言可供选择,如x86、ARM等。

选择合适的汇编语言要根据自己的需求和实际情况进行判断。

一般而言,x86是最常见和广泛使用的汇编语言之一。

Step 3:学习汇编语言基础知识汇编语言是一种与硬件直接交互的语言,因此学习者需要掌握一些基础的概念和知识。

首先,了解各种指令的含义和功能,如数据传输指令、算术和逻辑指令等。

其次,要学会使用寄存器进行数据的读写和计算。

最后,掌握常用的编程技巧和调试方法,如单步执行、断点调试等。

Step 4:阅读汇编语言文档和教程阅读和理解汇编语言文档和教程是学习的关键。

可以选择一些经典的教材或者网络资源,比如《汇编语言》一书,或者在线的教学视频、博客文章等。

通过系统地学习和实践,逐渐掌握汇编语言的基本原理和技能。

Step 5:练习编写简单的程序尽早动手实践是掌握汇编语言的关键。

选择一些简单的编程项目,如计算器、加密算法等,通过编写相应的汇编语言程序来提升自己的编程能力。

可以加入一些汇编语言编程的社区或者论坛,与其他学习者一起交流和分享经验。

Step 6:深入学习高级的汇编语言特性一旦掌握了汇编语言的基础知识,可以进一步学习一些高级的特性和技巧,如宏汇编、模块化编程等。

学习者可以深入研究相关的文献和资料,提升自己的编程水平。

Step 7:应用汇编语言进行优化汇编语言被广泛应用于性能敏感的领域,如游戏开发、图形处理等。

x64汇编基础知识

x64汇编基础知识

x64汇编基础知识x64汇编语⾔在win32asm上做了较⼤改进,如果只凭借之前win32asm的只是来试⽔x64asm,则会有很多意想不到的bug,总的来说x64asm更加⾃由,更加有趣。

1.对32位寄存器的写操作和运算操作,则会对相应的64位寄存器的⾼32位清零。

如在x64dbg上实验,mov eax, 1和add eax, 1会使rax的⾼32位清零;xor eax, eax是对eax的清零运算操作,所以xor rax, rax会被编译器优化为指令更短的xor eax, eax因为⼆者在x64汇编中的效果是⼀样的;但是mov ax,1和mov al, 1不会对rax的⾼32位进⾏清零的操作。

2.⽴即数的使⽤,优先使⽤32位扩展,64位的⽴即数使⽤较少。

push指令和对内存的写操作只⽀持4字节的⽴即数数据,⽐如push 0x12345678和mov qword ptr [rax], 0x12345678是合法的,但是如果要对长度长于4字节的⽴即数使⽤(⽐如0x2134567890),就需要分两步进⾏,借⽤寄存器进⾏操作,如需要将0x1234567890压栈,应当:mov rax,0x2134567890; push rax.3.x64汇编的⼀些其他的基础知识⽐较常⽤的通⽤寄存器:rax eax ax alrcx ecx cx clrdx edx dx dlrbx ebx bx blrsp esp sp splrbp ebp bp bplrsi esi si silrdi edi di dilr8 r8d r8w r8br9 r9d r9w r9br10 r10d r10w r10br11 r11d r11w r11br12 r12d r12w r12br13 r13d r13w r13br14 r14d r14w r14br15 r15d r15w r15b此外还有rip, xmm0~xmm15的多媒体⽤寄存器,rflags。

汇编语言上机环境及基本操作

汇编语言上机环境及基本操作

汇编语言上机环境及基本操作汇编语言是一种低级语言,它直接面向硬件,可以直接访问计算机的底层资源。

为了学习和实践汇编语言,我们需要了解如何搭建汇编语言上机环境以及其基本操作。

本文将介绍汇编语言上机环境的安装和基本操作的步骤,并给出一些示例。

1. 汇编语言上机环境的安装在搭建汇编语言的上机环境之前,我们首先需要确认计算机的操作系统。

通常,我们可以在Windows操作系统上进行汇编语言的开发和调试。

下面是汇编语言上机环境的安装步骤:1.1 下载汇编语言开发工具汇编语言开发工具有很多种,比如MASM、NASM等。

根据个人的喜好和需求选择合适的工具进行下载。

1.2 安装汇编语言开发工具双击下载文件并按照提示完成安装过程。

一般来说,安装过程中可使用默认配置,无需特殊设置。

1.3 配置环境变量配置环境变量可以使得我们在任意路径下都可以运行汇编语言代码。

找到系统环境变量中的"Path"变量,添加汇编语言开发工具的安装路径。

例如,如果您选择了MASM,将其安装路径添加到"Path"变量中即可。

安装好汇编语言开发工具后,我们就可以开始进行汇编语言的实践了。

2. 汇编语言的基本操作接下来我们将介绍汇编语言的一些基本操作,包括编写代码、汇编、链接和运行等。

2.1 编写汇编语言代码打开一个文本编辑器(如记事本),编写汇编语言的代码。

汇编语言与高级语言相比,语法更为底层,需要对计算机的底层结构有一定的了解。

可以参考相关教材或者网络资源,编写简单的汇编语言代码。

2.2 汇编将编写好的汇编语言代码保存为.asm文件。

然后,打开命令提示符(或者使用汇编语言开发工具自带的命令行工具),进入.asm文件所在目录,并执行如下命令进行汇编:> asm 文件名.asm汇编成功后,将生成相应的.obj文件。

2.3 链接汇编语言代码中可能会引用一些外部的库文件,我们需要将这些库文件与生成的.obj文件进行链接。

64位汇编语言简介

64位汇编语言简介

x86-64位汇编语言简介一、x86-64的寄存器x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是:rax,rbx,rcx,rdx,rsi,rdi,rsp,rbpr8,r9,r10,r11,r12,r13,r14,r15同时,x86-64全面支持x86-32和x86-16的通用寄存器:eax,ax,al,ah,ebx,bx,bl,bh,....而且,还对传统的edi,esi做了改进:edi ,32位di,16位dil ,8位,在传统的x86机器中,di是不可按照8位来访问的,但在x86-64下可以。

同样esi也可以按照8位来访问。

一个很特别的寄存器rip,相当于x86-32的eip.在x86-32是不可直接访问的,如mov eax,eip是错的,但在x86-64位下却可以,如mov,rax,qword ptr [rip+100]是对的。

而且,它除了是个程序计数器外,也是个“数据基地址”,有此可见,它现在是身兼两职!为什么在x86-64位下要用rip做访问数据的基地址呢?因为,在x86-64下,DS,ES,CS,SS都没有实际意义了,也就是说,它们不再参与地址计算,只是为了兼容x86-32。

FS,GS还是参与地址计算,它们两个和x86-32的意义相同。

二、x86-64的汇编x86-64的汇编和x86-32的没有多大的区别。

添加了新寄存器和指令。

写64位汇编代码时,可以用8、16、32、64位寄存器,如:push rdisub rsp, 48 ;mov r10, rcx; Line 36mov rdi, rdxxor eax, eaxmov ecx, 512rep stosb; Line 43movsxd r8, DWORD PTR [r10+16]mov QWORD PTR [rsp+32], rdxmov r9, QWORD PTR [r10+648]mov rdx, QWORD PTR [r10+52]mov rcx, QWORD PTR [r10+44]call fs_read_disk; Line 47mov ecx, 1cmp eax, ecxcmovne ecx, eaxmov eax, ecx; Line 52add rsp, 48pop rdiret 0再如:$L1818:; Line 2398mov al, BYTE PTR [rdx+rbx]cmp al, 32jne SHORT $L1819mov BYTE PTR [rdx+rbx], 0$L1819:add r8d, 1movsxd rdx, r8dxor eax, eaxmov rcx, r12mov rdi, rbxrepne scasbnot rcxsub rcx, 1cmp rdx, rcxjb SHORT $L1818但,有点值得注意,当操作传统的32位寄存器时,那么,整个64位寄存器都会受到影响,如:mov eax,0ah那么,rax也等于000000000000000ah再如:mov rcx,0aaaaaaaaaaaaaaaah(此时ecx等于0aaaaaaaah)mov ecx,0ddddddddh(此时,rcx等于00000000ddddddddh,高32位受到了影响).规则:Example 1: 64-bit Add:Before:RAX =0002_0001_8000_2201RBX =0002_0002_0123_3301ADD RBX,RAX ;48 is a REX prefix for size.Result:RBX = 0004_0003_8123_5502Example 2: 32-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD EBX,EAX ;32-bit addResult:RBX = 0000_0000_8123_5502(32-bit result is zero extended)Example 3: 16-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BX,AX ;66 is 16-bit size overrideResult:RBX = 0002_0002_0123_5502(bits 63:16 are preserved)Example 4: 8-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BL,AL ;8-bit addResult:RBX = 0002_0002_0123_3302(bits 63:08 are preserved)三、指令集变化小结:当然,这里说的都是最基本的东西,是针对通用寄存器言的。

汇编语言入门教程

汇编语言入门教程

汇编语言入门教程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.可将寄存器内的数据执行算术及逻辑运算。

WindowsX8664位汇编语言入门

WindowsX8664位汇编语言入门

WindowsX8664位汇编语言入门Windows x86-64位汇编语言入门汇编语言是计算机硬件和操作系统之间的桥梁,它能够直接控制计算机的底层硬件。

对于计算机科学的学习者来说,了解汇编语言是非常重要的一步。

本文将介绍如何入门并学习Windows x86-64位汇编语言。

一、了解汇编语言的基本概念在开始学习汇编语言之前,我们需要先了解一些基本概念。

汇编语言是一种低级语言,它使用助记符来代替机器指令,这样更方便我们理解和编写程序。

汇编语言的基本单位是指令,每条指令对应着一条机器指令。

在x86-64架构中,指令长度可以是1到15个字节。

二、安装并配置开发环境要开始编写和执行汇编语言程序,我们首先需要安装一个好的开发环境。

在Windows操作系统上,常用的开发环境有MASM、NASM、TASM等。

这些开发工具可以帮助我们将汇编代码转换为可执行文件。

三、学习汇编语言的语法和指令集汇编语言与其他高级编程语言相比,语法更加简单和直接。

学习汇编语言的关键就是理解和掌握其语法和指令集。

在学习过程中,我们可以参考官方文档或者一些经典的教程,如《汇编语言程序设计》。

四、编写你的第一个汇编程序现在,我们可以尝试编写自己的第一个汇编程序。

我们可以从一个简单的程序开始,比如输出一个简单的“Hello, World!”。

下面是示例代码:section .datamsg db 'Hello, World!', 0section .textglobal _start_start:; 输出字符串mov eax, 4mov ebx, 1mov ecx, msgmov edx, 13int 0x80; 退出程序mov eax, 1xor ebx, ebxint 0x80这个程序使用Linux系统调用来输出字符串,并退出程序。

我们可以使用汇编器将其编译成可执行文件,然后在命令行中运行。

五、深入学习汇编语言的高级特性一旦掌握了汇编语言的基础知识,我们就可以进一步学习一些高级特性,如函数调用、内存管理、寄存器的使用等。

汇编语言教材assemblylanguage

汇编语言教材assemblylanguage

汇编语⾔教材assemblylanguage经典教材汇编语⾔教材很多,各种处理器都有涉及,粗略统计不下百种。

在这么多的教材⾥,⽤得较多的可以分类列举如下:x86处理器1.《x86汇编语⾔:从实模式到保护模式》,著,,2013-1 。

基于INTEL 处理器、NASM编译器和虚拟机。

汇编语⾔就是处理器的语⾔,从这个意义上来说,既然学习汇编语⾔,就必须直接⾯向硬件编程,⽽不是使⽤莫名其妙的中断和调⽤。

这是⼀本有趣的书,它没有把篇幅花在计算⼀些枯燥的数学题上。

相反,它教你如何直接控制硬件,在不借助于、DOS、、或者任何其他软件⽀持的情况下来显⽰、读取硬盘数据、控制其他硬件等。

我们知道,和是主流,和DOS操作系统已经成为历史,Linux和Windows都⼯作在保护模式下。

这本书从实模式讲到32位保护模式,尤其以32位保护模式为重点,阅读本书,对理解现代计算机和现代操作系统的⼯作原理有⾮常⼤的帮助作⽤。

2.《汇编语⾔》(第2版),王爽 著,清华⼤学出版社,2013-4-1基于INTEL 8086处理器、编译器,以及平台的汇编教材,完全以8086处理器的实模式为主,不涉及常⽤的32位和64位模式,但因为通俗易懂,读者反映很好。

3.《80X86汇编语⾔程序设计教程》,杨季⽂等编著,清华⼤学出版社,1999-3-1基于INTEL x86处理器、MASM和编译器,包含16位实模式和32位保护模式的内容,⽽且对后者讲述较为详细。

4.《32位汇编语⾔程序设计》,钱晓捷 编著,机械⼯业出版社,2011-8-1基于INTEL x86处理器、MASM编译器,以及WINDOWS平台的汇编教材。

5.《16/32位微机原理汇编语⾔及接⼝技术》,钱晓捷,陈涛编著,机械⼯业出版社,2005-2-1基于INTEL x86处理器,论述16位微型计算机的基本原理、汇编语⾔和接⼝技术,并引出32位微机系统相关技术。

6.《Intel汇编语⾔程序设计》(第五版),(美)欧⽂ 著,电⼦⼯业出版社,2012-7-1基于INTEL x86处理器、MASM编译器,以及DOS/WINDOWS平台的汇编教材,既有16位实模式的内容,也有32位保护模式的内容。

Windows编程基本手册

Windows编程基本手册

6.3 注意点1.路径分隔符是反斜杠\,但是在CreateFile等其他低级的API中正斜杠也可以用,最好避免造成不兼容性,目录和文件名大小不敏感,但是大小写保持,路径名最大为MAX_PATH 260长,但可以通过转义字符指定非常长的名称,如加上\ \ ?及使用Unicode字符避开这个限制,可以长达32K个字符的名称2. Unicode 字符集,使用#define _UNICODE 必须在<windows.h>前语句给出,默认使用的是8位字符,L使用的是16位字符,_T使用通用文本字符,包含tchar.h。

1.在所有的头文件之前加入#define UNICODE 和#define _UNICODE #include <tchar.h>2.tchar.h中的通用C库中没有memchr_fgettc,_itot替代itoa_stprintf替代sprintf_tcscpy替代strcpy_ttoi,_totupper,_totlower,以及_ftprintf(输出到文件)3.系统保留CONIN$和CONOUT$为控制台的输入输出,或直接使用GetStdHandle()4.CopyFile(lpExistingName,lpNewFileName,fFailifExists)如果已经有使用新名称的文件存在,那么只有在fFailIfExits等于FALSE 时这个文件才会被替换,CopyFile也复制文件的元数据,比如创建时间5.MoveFile如果新文件已经存在的话,一个进程在一个时间中只能有一个控制台6.利用va_list实现可变参数va_list arg_ptr:定义一个指向个数可变的参数列表指针;va_start(arg_ptr, argN):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,说明:argN是位于第一个可选参数之前的固定参数,(或者说,最后一个固定参数;…之前的一个参数),函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。

Windows X86 64位汇编语言入门

Windows X86 64位汇编语言入门

Windows X86-64位汇编语言入门Windows X64汇编入门(1)最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。

我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。

文章的标题包含了本文的四方面主要内容:(1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista64位版,调用的均为windows API。

(2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。

至于三者间的区别,可自行搜索。

(3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。

(4)入门:既是入门,便不会很全。

其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。

其二,便于类似我这样刚接触x64汇编的新手入门。

本文所有代码的调试环境:Windows Vista x64,Intel Core2Duo。

1.建立开发环境1.1编译器的选择对应于不同的x64汇编工具,开发环境也有所不同。

最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio2005一起发布。

因此,如果你是微软的忠实fans,直接安装VS2005既可。

运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。

它的最大好外是小,不用为了学习64位汇编安装几个G的VS。

因此,本文的代码就在GoASM下编译。

第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。

不同的编译器,语法会有一定差别,这在下面再说。

1.2IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。

教你如何在64位WIN7系统下配置汇编软件并运行汇编程序

教你如何在64位WIN7系统下配置汇编软件并运行汇编程序

64位WIN7系统如何使用汇编软件并运行汇编程序有很多同学使用的都是64位的windows系统,但是会发现有很多软件不支持64位系统,特别是学习汇编语言的同学,更是烦恼。

要做汇编实验却发现64位的Win7系统没有Debug.exe调试程序,于是从Windows xp或32位win7系统上复制了一个debug.exe到自己的电脑上,却发现debug在64位的电脑上不兼容。

64位系统运行汇编后的exe程序结果如下:64位系统运行debug结果如下:然而,我们不能放弃对汇编的学习,因此特分享以下两种方法供学习汇编的同学们解决不兼容问题:一、 借助DOSBox;(1)软件要求:①DOSBox软件;②Debug调试程序(可以从Windows xp或32位win7系统电脑里复制,其所在路径应该是:C:\Windows\System32,找到debug.exe);③masm.exe;link.exe;ml.exe;ml.err:做汇编的四个小程序(最好能够从网上下载一个版本较高点的,这样能在自己的命令提示符里直接使用这四个程序,使用也就更方便);(2)开始安装:双击打开DOSBox软件,按步骤进行安装,安装目录任选,不过由于C盘是系统盘,所以最好安装在其他盘里;安装成功后打开DOSBox, 我们就可以看到一个非常熟悉的界面了,和电脑里的命令提示符DOS窗口差不多,界面如下:(注意:由于它的两个窗口是在一起作用的,所以使用的时候不要关掉其中的任一个窗口)安装完DOSBox后,我们就能运行汇编后的程序了(3)相关设置操作:①DOSBox相关设置打开DOSBox后,我们可以看到Z : \ >,这是DOSBox里的虚拟盘,我们可以采用mount命令将其转变到自己的D盘:mount d d:\myassembly这里,我在D盘建立了一个文件夹myassembly,作为自己做汇编实验的文件存放位置;使用该命令后,d符号也就虚拟成了自己本地电脑的d:\myassembly 目录;然后转换盘符就行了;但是,我们每一次打开DOSBox都要进行这两步有点麻烦,因此,我们也可以如下这样一步到位:开始——>所有程序——>DOSBox文件——>打开DOSBox 0.74 Options,在打开的文本里找到[autoexec](应该会在文本的最后位置),根据你自己做汇编实验的文件夹所在路径进行相应的设置,在;[autoexec]项的末尾写上上面的两条命令:以我的文件路径为例:这样在我们再次打开DOSBox时,就会直接加载上述命令;②debug设置把debug.exe放入我们之前设置的做汇编实验的文件夹目录下于是我们就可以在DOSBox下使用Debug调试程序如下:二、安装虚拟机;我们可以安装一个虚拟机,装上Windows xp系统。

64位下的相对指令地址-X86指令格式(操作码列和指令列解释)

64位下的相对指令地址-X86指令格式(操作码列和指令列解释)

64位下的相对指令地址-X86指令格式(操作码列和指令列解释)寻找64位系统某符号特征码时发现他的MOV指令⽤的是相对地址,之前32位下从来没听说MOV还能⽤相对地址,故查阅了下Intel指令⼿册。

在MOV指令介绍下找到如下介绍:In 64-bit mode, the instruction’s default operation size is 32 bits. Use of the REX.R prefix permits access to additionalregisters (R8-R15). Use of the REX.W prefix promotes operation to 64 bits. See the summary chart at thebeginning of this section for encoding data and limits.在64位下仍使⽤32位操作数,REX.R扩展寄存器,REX.W扩展指令。

REX前缀结构:关于RIP的介绍:2.2.1.6 RIP-Relative AddressingA new addressing form, RIP-relative (relative instruction-pointer) addressing, is implemented in 64-bit mode. Aneffective address is formed by adding displacement to the 64-bit RIP of the next instruction.In IA-32 architecture and compatibility mode, addressing relative to the instruction pointer is available only withcontrol-transfer instructions. In 64-bit mode, instructions that use ModR/M addressing can use RIP-relativeaddressing. Without RIP-relative addressing, all ModR/M modes address memory relative to zero.RIP-relative addressing allows specific ModR/M modes to address memory relative to the 64-bit RIP using a signed32-bit displacement. This provides an offset range of ±2GB from the RIP. Table 2-7 shows the ModR/M and SIBencodings for RIP-relative addressing. Redundant forms of 32-bit displacement-addressing exist in the currentModR/M and SIB encodings. There is one ModR/M encoding and there are several SIB encodings. RIP-relativeaddressing is encoded using a redundant form.In 64-bit mode, the ModR/M Disp32 (32-bit displacement) encoding is re-defined to be RIP+Disp32 rather thandisplacement-only. See Table 2-7.The ModR/M encoding for RIP-relative addressing does not depend on using a prefix. Specifically, the r/m bit fieldencoding of 101B (used to select RIP-relative addressing) is not affected by the REX prefix. For example, selectingR13 (REX.B = 1, r/m = 101B) with mod = 00B still results in RIP-relative addressing. The 4-bit r/m field of REX.Bcombined with ModR/M is not fully decoded. In order to address R13 with no displacement, software must encodeR13 + 0 using a 1-byte displacement of zero.RIP-relative addressing is enabled by 64-bit mode, not by a 64-bit address-size. The use of the address-size prefixdoes not disable RIP-relative addressing. The effect of the address-size prefix is to truncate and zero-extend thecomputed effective address to 32 bits.RIP是64位的新特性,在64位下,指令使⽤特定的Mod\rm来使⽤RIP,RIP的偏移是32位故寻址范围为上下2GB。

汇编语言x86汇编指令集大全

汇编语言x86汇编指令集大全

汇编语言x86汇编指令集大全汇编语言是计算机体系结构学科中的重要内容之一,它可以直接操作计算机硬件,实现对机器指令的精确控制。

而x86汇编则是汇编语言中最常用的一种,它广泛应用于各类个人电脑和服务器等计算设备中。

x86汇编指令集是汇编语言中的核心,掌握其基本指令对于开发高效的汇编程序至关重要。

本文将介绍x86汇编指令集的各个方面,包括数据传输指令、算术运算指令、逻辑运算指令、分支控制指令以及其他常用指令等内容,以帮助读者全面理解和掌握x86汇编语言。

一、数据传输指令数据传输指令是汇编语言中最基本的指令之一,用于实现数据在寄存器、内存和I/O端口之间的传递。

常见的数据传输指令包括MOV、XCHG、PUSH和POP等。

MOV指令用于将数据从一个位置传送到另一个位置,可以将数据从内存中传送到寄存器,也可以将数据从寄存器传送到内存。

例如,MOV AX, BX表示将寄存器BX中的数据传送到寄存器AX中。

XCHG指令用于交换两个操作数的值,例如,XCHG AX, BX表示交换寄存器AX和BX中的数据。

PUSH指令将数据推入堆栈,POP指令从堆栈中弹出数据。

这两个指令常用于函数调用和局部变量的保存与恢复。

二、算术运算指令算术运算指令用于执行各种数值计算操作,包括加法、减法、乘法、除法以及取模等。

常见的算术运算指令包括ADD、SUB、MUL、DIV和IMUL等。

ADD指令用于进行加法运算,可以将两个操作数相加,并将结果保存在目标操作数中。

例如,ADD AX, BX表示将寄存器BX中的值加到寄存器AX中。

SUB指令用于进行减法运算,可以将目标操作数减去源操作数,并将结果保存在目标操作数中。

MUL指令用于进行无符号数的乘法运算,可以将一个操作数与寄存器中的值相乘,并将结果保存在一对寄存器中。

DIV指令用于进行无符号数的除法运算,可以将寄存器中的值除以一个操作数,并将商保存在一个寄存器中,余数保存在另一个寄存器中。

IMUL指令用于进行有符号数的乘法运算,功能与MUL指令类似,但结果为有符号数。

汇编语言程序环境搭建masm+debug64位win107

汇编语言程序环境搭建masm+debug64位win107

汇编语⾔程序环境搭建masm+debug64位win107介绍:MASM是Microsoft Macro Assembler 的缩写,是微软公司为微处理器家族开发的,拥有可视化的开发界⾯,使开发⼈员不必再使⽤环境进⾏汇编的开发,编译速度快,⽀持80x86汇编以及,是下开发汇编的利器。

它与平台的磨合程度⾮常好,但是在其他平台上就有所限制,使⽤MASM的开发⼈员必须在windows下进⾏开发。

1. 在windows下搭建汇编编程环境:王爽《汇编程序》第三版⽤的是MASM5.0下载安装包:1)、DOSBox 链接:密码:xdgh2) 、MASM5.0 链接:密码:hku53)、DEBUG 链接:密码:rmsi把debug.exe复制到masm⽬录下。

2. 下载汇编参考⼿册:链接:密码:80fc3. 第⼀个汇编程序:在命令⾏输⼊eg0101.exe,得到程序运⾏结果:Hello Assemly!汇编程序eg0101.asm的内容:include io32.inc.data ;数据段msg byte 'Hello,Assembly!',13,10,0.code ;代码段start:;程序执⾏起始位置mov eax,offset msgcall dispmsgexit 0;程序正常执⾏终⽌end start ;汇编结束5. debug完整配置:汇编语⾔环境:MASM,但是调试需要debug.exe,并且debug.exe不能⽤于64位计算机系统。

所以64位计算机系统使⽤的汇编语⾔环境是:1. 下载DOSBox2. 下载debug.exe在输⼊框状态下z:> ,z:>mount d d:\简洁的讲,你把你要虚拟的⽂件夹位置换掉上⾯的。

mount d d:\d:cd MASMdosbox配置debug1. 有疑问查看DOSBox⽬录下的DOSBox 0.74 Manual.txt⼿册指导2. 打开配置⽂件DOSBox 0.74 Options.bat,因为我的masm和debug都安装在D盘下,所以在本配置⽂件最后⾯的[autoexec]加上MOUNT D D:\D:意思是挂载到D盘下(这⼀步骤也可以不做,直接看下⾯的。

汇编基础入门知识

汇编基础入门知识

汇编基础⼊门知识From:学习汇编前你应该知道的知识1、汇编需要什么⼯具和程序,到哪⾥下载?⽬前阶段,汇编程序仅需要两个程序就够了。

masm.exe,link.exe。

前者是编译程序,后者是链接程序。

另外,为了验证和调试程序,还需要⼀个程序debug.exe,该程序由windows本⾝就提供。

将⼆者下载后,放到某⼀个⽬录中(任意⽬录都可以),考虑到很多命令需要通过键盘敲⼊,所以建议你不要把⽂件放⼊到长⽂件名⽬录、中⽂⽬录或很深的⽬录中。

⽐如你可以建⼀个“D:\Masm”⽬录,并建议此后的程序都放这个⽬录,此后称这个⽬录为汇编⽬录。

2、学习汇编需要有哪些编程⽅⾯的知识?没有任何编程⽅⾯的知识,学习此语⾔等于缘⽊求鱼,所以请放弃学习的想法。

⼀般来说⾄少要知道如下⼏点:*)程序的运⾏逻辑结构有顺序(按语句依次执⾏)、分⽀结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构。

*)知道什么是⼦程序,什么是调⽤。

*)汇编程序员的视⾓。

不同编程视⾓编程要求是不⼀样的。

⽐如删除⽂件:>>⽤户的视⾓是找到“删除”按钮或菜单,然后单击⼀下即可。

>>⾼级程序员的视⾓是知道删除的⽂件,并发出删除命令。

这些通过API实现。

>>汇编程员的视⾓是得到要删除的⽂件名,找到该⽂件所在位置,通过调⽤删除“中断命令”进⾏删除。

>>操作系统开发⼈员的视⾓则是接到删除命令后,先找到系统根⽬录区,由根⽬录区的链接依次找到⼦⽬录区,直到找到要删除的⽂件,然后按照操作系统删除⽂件的规则对该⽂件名进⾏修改。

⽐如DOS,只把第⼀个字符改成"?"。

按程序语句等价的⾓度看,⼀⾏VB的打印语句,⽤汇编实现⼤约需要⼀百⼆⼗多⾏。

知道汇编语⾔的视⾓后就要知道,前⾯的道路是坎坷的,没有耐⼼是不⾏的。

想通过⼏分钟⼏⾏程序就完成很复杂的操作不是件容易的事。

3、学汇编有什么⽤?汇编产⽣于DOS时代或更早,⽽现在是Windows时代,所以可能遗憾地说:尽管还有批⽜⼈在⽤汇编开发核⼼级程序,但我们⼏乎没什么⽤,除了必要时间能拿来分析⼀两个程序的部分代码之外,别的也就没⼲什么⽤了。

汇编语言-X86处理器架构-64位x86处理器

汇编语言-X86处理器架构-64位x86处理器

汇编语⾔-X86处理器架构-64位x86处理器64位x86-64处理器 针对所有使⽤x86-64指令集的64位处理器的基本架构细节。

包括Intel64和AMD64处理器。

具有以下基本特点: 1.向后兼容x86指令集 2.地址长度为64位,虚拟地址空间为2的64字节 3.可以使⽤64位通⽤寄存器 4.⽐x86-32多了8个通⽤寄存器 5.物理地址为48位,⽀持⾼达256TB的RAM 1 64位操作模式 intel64架构引⼊了IA-32e新模式,这个模式可以分为两个模式:兼容模式(compatibility mode)和64位模式(64-bit mode)。

兼容模式(compatibility mode): 在这个模式下16和32位应⽤程序不⽤重新进⾏编译就可以运⾏。

16位windows(win16)和DOS应⽤程序不能运⾏在win64位下。

64位模式(64-bit mode): 处理器执⾏的是64位线性地址空间的应⽤程序。

这个模式是64位Microsoftt Windows的原⽣模式 2 基本64位执⾏环境 64位模式和32位的主要区别: ⽐32位多8个通⽤寄存器,有16个通⽤寄存器 有8个浮点寄存器 1个64位状态标志寄存器RFLAGS(只采⽤低32位),32位的称为EFLAGS 1个64位指令指针寄存器RIP,32位的称为EIP 8个64位MMX寄存器 16个128位XMM寄存器(32位模式只有8个XMM寄存器) 2.1 通⽤寄存器 64位的通⽤寄存器可以访问8位,16位,32位和64位数据。

操作位可⽤寄存器64位RAX,RBX,RCX,RDX,RDI,RSI,RBP,RSP,R8,R9,R10,R11,R12,R13,R14,R1532位EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP,R8D,R9D,R10D,R11D,R12D,R13D,R14D,R15D16位AX,BX,CX,DX,DI,SI,BP,SP,R8W,R9W,R10W,R11W,R12W,R13W,R14W,R15W8位AL,BL,CL,DL,DIL,SIL,BPL,SPL,R8L,R9L......还有后缀把L改为R 2.2 细节处理 64位模式和32位的主要区别: ⽐32位多8个通⽤寄存器,有16个通⽤寄存器 有8个浮点寄存器 1个64位状态标志寄存器RFLAGS(只采⽤低32位),32位的称为EFLAGS 1个64位指令指针寄存器RIP,32位的称为EIP 8个64位MMX寄存器 16个128位XMM寄存器(32位模式只有8个XMM寄存器) 2.1 通⽤寄存器 64位的通⽤寄存器可以访问8位,16位,32位和64位数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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上安装了32位的操作系统,就算编译成功也无法运行程序。

2. 寄存器的改变汇编是直接与寄存器打交道的语言,因此硬件对语言影响很大。

先来看看x64与x32相比在硬件上多了什么,变了什么(图2)。

X64多了8个通用寄存器:R8、R9、R10、R11、R12、R13、R14、R15,当然,它们都是64位的。

另外还增加了8个128位XMM寄存器,不过通常用不着。

X32中原有的寄存器在X64中均为扩展为64位,且名称的第一个字母从E改为R。

不过我们还是可以在64位程序中调用32位的寄存器,如RAX(64位)、EAX(低32)、AX (低16位)、AL(低8位)、AH(8到15位),相应的有R8、R8D、R8W和R8B。

不过不要在程序中使用如AH之类的寄存器,因为在AMD的CPU上这种用法会与某些指令产生冲突。

3. 第一个x64汇编程序本节,我们开始编写自己的第一个x64汇编程序。

在这之前,先讲一下calling convention的改变。

3.1 API调用方式把Calling convention放在第一个讲,代表它的重要性。

在32位汇编中,我们调用一个API时,采用的是stdcall,它有两个特点:一是所有参数入栈,通过椎栈传递;二是被调用的API负责栈指针(ESP)的恢复,我们在调用MessageBox后不用add esp,14h,因为MessageBox已经恢复过了。

而在x64汇编中,两方面都发生了变化。

一是前四个参数分析通过四个寄存器传递:RCX、RDX、R8、R9,如果还有更多的参数,才通过椎栈传递。

二是调用者负责椎栈空间的分配与回收。

下面给出一段代码,功能是显示一个简单的MessageBox,注意对RSP的操作:代码:这段代码是在GoASM中编译,指令部分GoASM与ML64差不多,关键是一些宏的定义有差别。

比如masm中的.code,在这里就成了CODE SECTION。

下面再说区别,先编译。

GoASM 中编译分两步:(1)编译:goasm /x64 1.asm(2)链接:golink 1.obj user32.dll如果一些正常,命令行中应显示图3的内容。

运行一下,我们的第一个64位windows程序就运行了。

GoASM还有一个特点是支持宏:ARG和INVOKE,使用这两个宏可以免除程序员自己对椎栈进行操作。

不过初学吗,还是从基础掌握比较好。

下面的一段代码相同的功能的MASM代码,注意看看区别。

ML64至今仍不支持宏,所以每一步工作都要自己做。

代码:编译这段代码的命令行是:ml64 2.asm /link /subsystem:windows /entry:Main user32.lib。

如果正常,应该如图5显示那样。

很有意思吧,在64位系统下,我们仍然调用user32的API。

可能是名称用习惯了,微软自己都懒得改了吧。

3.2 64位的椎栈代码中还有一处值得注意,那就是sub rsp,28h和add rsp,28h。

28h这个数值是怎么来的呢?首先,x64中椎栈被扩展为64位;其次,我们在调用MessageBoxA时,要给四个参数外加一个返回地址留空间,因此8(位)*5=40=28h。

另外一些小问题要注意,AMD64不支持push 32bit寄存器的指令,最好的方法就是push 和pop都用64位寄存器。

EM64T如何?看了下Intel的开发手册,各个指令都分三种情况:纯32位、纯64位和32与64位混合。

下面是手册的片段:Opcode* Instruction 64-Bit Mode Compat/Leg Mode Descrip tionFF /6 PUSH r/m16 Valid Valid Push r /m16.FF /6 PUSH r/m32 N.E. Valid Push r /m32.FF /6 PUSH r/m64 Valid N.E. Push r/ m64.Default operand size 64-bits.没别的好方法,使用中多注意,尽量在64位程序中保用644. 一些参考资料写完了第一个hello world,本文就此打住。

本还想写一些内容,但掌握不深,留待下回吧。

感觉有些资料不得不在第一篇文章中放出来,因为它们是现有学习x64汇编的最好教材了,文中很多代码和知识点也来自于这些资料。

(1)《Moving to Windows x64》,出自:/Files/vista_x64.htm (2)GoASM的帮助文档,目前最好的64位汇编教程。

出自:(3)《开始进行 64 位 Windows 系统编程之前需要了解的所有信息》,出自:/china/MSDN/library/Windev/64bit/issues x64.mspx(4)来自CodeGurus的两篇文章《Assembler & Win64》,http://www.codegurus.be/codegurus/Programming/assembler&win64_en.htm《bout RIP relative addressing》http://www.codegurus.be/codegurus/Programming/riprelativeaddressing_en.htm (5)AMD开发手册(6)Intel开发手册,注意是新的《ntel® 64 and IA-32 Architectures software Developer’s Manual》Windows X64汇编入门(2)五一长假就要结束了,总算有时间好好睡了几个懒觉。

今天醒来后想到的第一件事就是,该写第二篇了。

64位技术现在还不成熟,没有好调试器,但是我们搞技术的总是对新东西充满了好奇和热情。

这个理由就足够我们现在开始学习64位汇编了!OK,Let’s go on。

1. 再说Calling convention关于API的调用方式,在入门(1)中说了一些,不过感觉有必要再讲两点。

一是在调用API时椎栈的框架,也就是Stack Frame,二是利用反汇编64位C/C++程序来研究calling convention。

先说Stack Frame。

图1是一个通用的椎栈框架。

在一个使用STDCALL的32位程序中,stack frame的四项工作:(1)传入参数的调用;(2)在返回caller时,callee要负责平衡椎栈;(3)给局部变量提供空间;(4)保证ebx、esi、edi和ebp四个寄存器的值不变(这种寄存器被称为non-volatile)。

在64位环境中,少了一个平衡椎栈的任务,因为平衡椎栈的工作由caller负责了,因此callee的stack frame只剩下三项工作:(1)将寄存器传入的参数和其它超过4个以上的参数在椎栈上保存(入栈);(2)给局部变量提供空间;(3)保证non-volatile寄存器的值不变,包括ebp、ebx、rdi、rsi、r12到r15,xmm6到xmm15。

所以,在一个函数的开始往往有如下代码:MOV [RSP+8h],RCXMOV [RSP+10h],RDXMOV [RSP+18h],R8MOV [RSP+20h],R9PUSH RBPMOV RBP,RSP而在返回时会有如下代码:LEA RSP,[RBP]POP RBPRET图2摘自GoASM的帮助文档,上文描述的情况在图中一目了然。

如果能在VC中编译64位C/C++程序,再用IDA反汇编,不是挺好的吗?正确,这正是我们玩儿逆向工程的人喜欢的方法。

Visual Studio 2005的64位开发环境设置网上有,这里不多说了。

以一个C/C++的代码为例:代码:这段代码是一个地球人都知道的窗口消息处理代码,在编译为64位程序后,用ida64看一下它的反汇编。

这样,熟悉而又有点陌生的64位汇编代码就出来了,包括消息的判断,EndDialog的调用等,确实很方便。

2. 第二个汇编例子:SMC在入门(1)中我们写了第一个64位的汇编程序,这里我们开始写第二个。

当然,代码本身还是有点意思的,这就是Self Modify Code。

让我们试一试SMC在64位下进行的如何?这还牵涉到vista的特性。

代码来自修改过的参考资料《About RIP relative addressing》。

相关文档
最新文档