.386 ;386指令集
.model flat,stdcall ;内存模型平坦,windowsAPI调用约定
option casemap:none ;区分大小写
include msvcrt.inc ;包含c运行时库文件
includelib msvcrt.lib ;包含c运行时链接库
include user32.inc
includelib user32.lib
.data ;数据段
;声明结构体
student struct
id dword ?
sz byte 20 dup(?)
student ends
;定义结构体变量
mystudent student <?>
;定义数据格式
;定义字符串 变量名,类型,初始值
szStr byte "hello world",0ah,0dh,0
szTitle byte "mimi",0
;普通变量
; 变量名,类型,初始值
ID dword 99
;定义数组 变量名 类型 数组长度 初始值
Array dword 10 dup(2)
.code ;伪指令,代码段开始
;定义函数 函数名 proc
fun proc
mov eax,99 ;返回值eax
ret
fun endp
start:
push offset szStr ;传递参数,offset伪指令,变量的地址
call crt_printf ;调用printf函数
add esp,04h; ;平衡堆栈
mov esi,offset Array ;使用数组
mov ecx, 5;
Loop1: ;定义标号
call fun ;调用自定义函数
dec ecx;
cmp ecx,0;
jz Loopend; ;跳转结束标号
jmp Loop1 ;跳转得到指定处
Loopend:
push 0 ;参数4
push offset szTitle
push offset szStr
push 0
call MessageBox
ret
end start ;程序入口点
end ;文件结束
=================
.386
.model flat,stdcall
option casemap:none
include msvcrt.inc
includelib msvcrt.lib
.data
sz byte "hello world",0ah,0dh,0
.code
;函数
fun proc
mov eax,5
ret
;ret 08h stdcall调用方式
fun endp
;add加法函数
fun_add proc
mov eax,[esp+04h];第一个参数
add eax,[esp+08h];第二个参数
ret
fun_add endp
;local_fun 局部变量 未开辟栈帧
fun_local proc
xor eax,eax
mov eax,099h;
mov dword ptr[esp-04h],055h ;局部变量
mov dword ptr[esp-08h],077h ;局部变量
sub esp,010h ;抬高栈帧
push offset sz
call crt_printf ;printf(sz);
add esp,04h ;平衡堆栈
ret
fun_local endp
;local2_fun 局部变量 开辟栈帧
fun_local2 proc
push ebp ;开辟栈帧
mov ebp,esp
sub esp,10h ;抬高栈帧
mov dword ptr[ebp-04h], 55h ;局部变量1
mov dword ptr[ebp-08h], 12h ;局部变量2
mov dword ptr[ebp-0ch], 34h ;局部变量3
push offset sz
call crt_printf
add esp,04h
mov esp,ebp
pop ebp
ret
fun_local2 endp
;local3_fun 开辟栈帧 参数位置
;ebp-4 局部变量
;ebp 旧的ebp
;ebp+4 返回地址
;ebp+8 参数1
;ebp+c 参数2
;
fun_local3 proc
push ebp ;开辟栈帧
mov ebp,esp
sub esp,010h ;抬高栈帧
push ecx; ;保存寄存器
mov ecx,099h;
push [ebp+08h] ;第一参数
call crt_printf
add esp,04h;
pop ecx; ;恢复寄存器
mov esp,ebp
pop ebp
ret
fun_local3 endp
;程序入口点
start:
;push 99h ;参数2
;push offset sz ;参数1
;call fun ;调用自己函数 fun(sz,0x99);
;push 50h ;参数2
;push 100h ;参数1
;call fun_add ;调用加法函数 fun_add(100,50)
;add esp,08h ;cdecl调用方式
;call fun_local
;call fun_local2
mov ecx,55;
push 99h ;参数2
push offset sz ;参数1
call fun_local3 ;fun_local3(sz,99h)
ret
end start
end