目录

x86汇编

x86汇编

8086的指令在32/64位的x86 CPU上都是能用的,所以汇编代码是类似的,80836之后的CPU 保护模式下段寄存器就不重要了,平常用的多的就是那8个通用寄存器(为啥用不到CS, DS, ES等寄存器了,请看这里):

通用寄存器含义低8位功能
EAX累加(Accumulator)寄存器AX(AH、AL)常用于乘、除法和函数返回值
EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.
ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器
EDX数据(Data)寄存器DX(DH、DL)常用于乘、除法和 I/O 指针
ESI来源索引(Source Index)寄存器SI常做内存数据指针和源字符串指针
EDI目的索引(Destination Index)寄存器DI常做内存数据指针和目的字符串指针
ESP堆栈指针(Stack Point)寄存器SP只做堆栈的栈顶指针; 不能用于算术运算与数据传送
EBP基址指针(Base Point)寄存器BP只做堆栈指针, 可以访问堆栈内任意地址, 经常用于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能用于算术运算与数据传送

64位CPU兼容32位的程序,所有下面的程序都是32位的,汇编器用的是NASM

调用MessageBox

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
; Message Box, 32 bit. V1.01
NULL          EQU 0                             ; Constants
MB_DEFBUTTON1 EQU 0
MB_DEFBUTTON2 EQU 100h
IDNO          EQU 7
MB_YESNO      EQU 4

extern _MessageBoxA@16                          ; Import external symbols,在“@”之后的数字表示了该函数所有参数的尺寸(字节为单位)
extern _ExitProcess@4                           ; Windows API functions, decorated

global Start                                    ; Export symbols. The entry point

section .data                                   ; Initialized data segment
 MessageBoxText    db "Do you want to exit?", 0
 MessageBoxCaption db "MessageBox 32", 0

section .text                                   ; Code segment
Start:
 push  MB_YESNO | MB_DEFBUTTON2                 ; 4th parameter. 2 constants ORed together
 push  MessageBoxCaption                        ; 3rd parameter
 push  MessageBoxText                           ; 2nd parameter
 push  NULL                                     ; 1st parameter
 call  _MessageBoxA@16

 cmp   EAX, IDNO                                ; Check the return value for "No"
 je    Start

 push  NULL
 call  _ExitProcess@4

用nasm编译nasm -f win32 fun.asm -o fun.obj
用golink链接golink /entry:Start kernel32.dll user32.dll fun.obj

参考: