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
30
; 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

参考: * nasm-messagebox32