Introducción al ensamblaje de Windows X64

Introducción al ensamblaje de Windows X64 (1)
Tankaiha

    recientemente entró en contacto con algunos conocimientos sobre el ensamblaje de 64 bits. Aquí hay un resumen. Uno es una revisión de la etapa de aprendizaje y el otro es que es útil para el ensamblaje de 64 bits novato. También soy nuevo en esta área del conocimiento. Debe haber algo mal en el texto.
El título del artículo contiene el contenido principal de los cuatro aspectos de este artículo:
(1) Windows: este artículo es el diseño del ensamblador en el entorno de Windows, el entorno de depuración es la versión de Windows Vista de 64 bits, todos llaman API de Windows.
(2) X64: este artículo trata sobre el ensamblaje x64, donde x64 representa AMD64 y EM64T de Intel, pero no incluye IA64. En cuanto a la diferencia entre los tres, puedes buscar por ti mismo.
(3) Ensamblado: como su nombre lo indica, el lenguaje de programación discutido en este artículo es ensamblado, y la programación de 64 bits en otros lenguajes de alto nivel no pertenece a la categoría de discusión.
(4) Entrada: como es una entrada, no estará completa. Primero, hay mucho conocimiento en el artículo que solo apunta al final, y queda un estudio más profundo para el trabajo duro futuro. En segundo lugar, es conveniente para los principiantes como yo que son nuevos en el ensamblaje x64.
        El entorno de depuración de todo el código en este artículo: Windows Vista x64, Intel Core 2 Duo.

1. Establecer el entorno de desarrollo
1.1 La elección del compilador
    corresponde a diferentes herramientas de ensamblaje x64, y el entorno de desarrollo también es diferente. El más común es el MASM de Microsoft. En el entorno x64, el compilador correspondiente ha cambiado de nombre a ml64.exe, que se lanzó con Visual Studio 2005. Por lo tanto, si eres un fanático fiel de Microsoft, puedes instalar VS2005 directamente. Cuando se ejecute, simplemente abra la ventana de línea de comandos de 64 bits correspondiente (Figura 1) y podrá compilar con ml64.


    El segundo compilador recomendado es GoASM, que contiene tres archivos: compilador GoASM, enlazador GoLINK y compilador de recursos GoRC, y viene con el directorio Incluir. Su mayor ventaja es que es pequeño, y no hay necesidad de instalar algunos G VS para aprender el ensamblaje de 64 bits. Por lo tanto, el código de este artículo se compila bajo GoASM.

    El tercer Yasm, porque no estoy familiarizado con él, así que no los repetiré. Los amigos interesados ​​lo prueban solos.
Los diferentes compiladores tienen una sintaxis diferente, que se describirá a continuación.

1.2 Selección de IDE
    Busque en Internet y no encuentre ningún IDE que admita asm64, ni siquiera un editor. Por lo tanto, la forma más fácil es modificar el archivo de sintaxis masm de EditPlus, que también es el método que utilicé, al menos puede obtener resaltado de sintaxis. Por supuesto, si eres demasiado vago para usarlo, usa el bloc de notas.
    Sin un IDE, debe ingresar manualmente una gran cantidad de parámetros y opciones cada vez que compila, solo realice un proceso por lotes.

1.3 Hardware y sistema operativo El
    requisito de hardware es una CPU de 64 bits. El sistema operativo también debe ser de 64 bits. Si se instala un sistema operativo de 32 bits en una CPU de 64 bits, el programa no se puede ejecutar incluso si la compilación es exitosa.

2. El cambio de
    ensamblaje de registros es el lenguaje que trata directamente con los registros, por lo que el hardware tiene una gran influencia en el idioma. Echemos un vistazo a lo que es más y lo que ha cambiado en el hardware de x64 en comparación con x32 (Figura 2).


    X64 tiene 8 registros más generales: R8, R9, R10, R11, R12, R13, R14, R15, por supuesto, todos son de 64 bits. Además, se han agregado ocho registros XMM de 128 bits, pero generalmente no son necesarios.
    Los registros originales en X32 se extienden a 64 bits en X64, y la primera letra del nombre se cambia de E a R. Pero aún podemos llamar registros de 32 bits en programas de 64 bits, como RAX (64 bits), EAX (bajo 32), AX (bajo 16 bits), AL (bajo 8 bits), AH (8 a 15 bits), En consecuencia, hay R8, R8D, R8W y R8B. Sin embargo, no use registros como AH en el programa, porque este uso en las CPU AMD entrará en conflicto con ciertas instrucciones.

3. El primer ensamblador x64 En
    esta sección, comenzamos a escribir nuestro primer ensamblador x64. Antes de eso, déjenme hablar sobre los cambios en la convención de convocatoria.
3.1 Método de llamada API
    Ponga la convención de llamadas en la primera charla, lo que representa su importancia. En el ensamblaje de 32 bits, cuando llamamos a una API, usamos stdcall, que tiene dos características: una es que todos los parámetros se colocan en la pila y se pasan a través de la pila vertebral; la segunda es que la API llamada es responsable de la recuperación del puntero de la pila (ESP), No necesitamos agregar esp, 14h después de llamar a MessageBox, porque MessageBox ha sido restaurado.
En el ensamblaje x64, ambos aspectos han cambiado. Una es que los primeros cuatro análisis de parámetros se pasan a través de cuatro registros: RCX, RDX, R8, R9. Si hay más parámetros, se pasan a través de la pila de vértebras. El segundo es que la persona que llama es responsable de la asignación y el reciclaje del espacio de la pila.
    A continuación se muestra un código, la función es mostrar un cuadro de mensaje simple, preste atención al funcionamiento de RSP:

1

2

3

4 4

5 5

6 6

7 7

8

9 9

10

11

12

13

14

15

dieciséis

;示例代码1.asm

;语法:GoASM

DATA SECTION

text     db 'Hello x64!', 0

caption  db 'My First x64 Application', 0

 

CODE SECTION

START:

sub rsp,28h

xor r9d,r9d

lea r8, caption

lea rdx, text

xor rcx,rcx

call MessageBoxA

add rsp,28h

ret



    Este código está compilado en GoASM. La parte de instrucción de GoASM es similar a ML64. La clave es que algunas macros tienen definiciones diferentes. Por ejemplo, el .code en masm se convierte aquí en SECCIÓN DE CÓDIGO. Déjame hablar sobre la diferencia a continuación, compila primero. La compilación en GoASM se divide en dos pasos:
(1) Compilación: goasm / x64 1.asm
(2) Vinculación: golink 1.obj user32.dll
    Si algo es normal, el contenido de la Figura 3 debe mostrarse en la línea de comandos.


    Ejecútelo, se ejecutará nuestro primer programa de Windows de 64 bits.


    Otra característica de GoASM es el soporte de macros: ARG e INVOKE. El uso de estas dos macros puede evitar que los programadores operen la pila de vértebras. Pero para los principiantes, es mejor dominar desde lo básico. El siguiente código tiene la misma función de código MASM, preste atención para ver la diferencia. ML64 aún no admite macros, por lo que cada paso del trabajo debe hacerlo usted mismo.

1

2

3

4 4

5 5

6 6

7 7

8

9 9

10

11

12

13

14

15

dieciséis

17

18 años

19

20

21

;示例代码2.asm

;语法:ML64

extrn MessageBoxA: proc

 

.data

text     db 'Hello x64!', 0

caption  db 'My First x64 Application', 0

 

.code

Main proc

sub rsp,28h

xor r9d,r9d

lea r8, caption

lea rdx, text

xor rcx,rcx

call MessageBoxA

add rsp,28h

ret

 

Main ENDP

end



    编译这段代码的命令行是: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      Description
FF /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位程序中保用64位寄存器。

4.        一些参考资料
    写完了第一个hello world,本文就此打住。本还想写一些内容,但掌握不深,留待下回吧。感觉有些资料不得不在第一篇文章中放出来,因为它们是现有学习x64汇编的最好教材了,文中很多代码和知识点也来自于这些资料。
(1)《Moving to Windows x64》,出自:http://www.ntcore.com/Files/vista_x64.htm
(2)GoASM的帮助文档,目前最好的64位汇编教程。出自:www.jorgon.freeserve.co.uk
(3)《开始进行 64 位 Windows 系统编程之前需要了解的所有信息》,出自:http://www.microsoft.com/china/MSDN/library/Windev/64bit/issuesx64.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》

发布了54 篇原创文章 · 获赞 89 · 访问量 68万+

Supongo que te gusta

Origin blog.csdn.net/ayang1986/article/details/104291349
Recomendado
Clasificación