X86汇编简单练习

2018-10-09  本文已影响0人  MagicalGuy
.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
上一篇 下一篇

猜你喜欢

热点阅读