美文网首页
X86汇编简单练习

X86汇编简单练习

作者: MagicalGuy | 来源:发表于2018-10-09 00:18 被阅读0次
.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

相关文章

  • X86汇编简单练习

    =================

  • iOS逆向学习(arm64汇编入门)

    iOS汇编 iOS汇编语音有很多钟。常见的有8086汇编、arm汇编、x86汇编等等。 arm汇编 iOS的架构从...

  • Swift-简单汇编指令、lldb常用指令

    汇编语言的分类分为:8086汇编(16bit)、x86汇编(32bit)、x64汇编(64bit)、ARM汇编(嵌...

  • 使用汇编调试iOS

    一、汇编语言的种类 1、8086汇编(16bit)2、x86汇编(32bit)3、x64汇编(64bit)4、AR...

  • arm64汇编基础

    iOS汇编 真机:arm64汇编 模拟器:x86汇编 将c语言的代码转化成汇编: 1. 寄存器 lldb查看当前a...

  • AT&T汇编(1)基本概念

    1、AT&T汇编 vs Intel汇编 基于x86架构的处理器所使用的汇编指令一般有2种格式a) Intel汇编D...

  • CAS从源码到底层实现

    2019.2.2 *更新CAS对应的x86汇编指令的解释,对底层实现又理解了一部分 全文简单概括 ​ CAS(...

  • iOS之ARM64汇编

    iOS的程序都是跑在ARM架构的机器上,所以iOS的汇编用到的就是ARM汇编 对于iOS开发汇编的分类: x86汇...

  • ARM64 学习

    iOS汇编 真机 arm64汇编,GNU 模拟器 x86, AT&T 汇编 寄存器 指令 堆栈 通用寄存器 64b...

  • AT&T汇编-函数实例

    AT&T 基于x86架构处理器汇编指令一般有2种格式:Intel汇编和AT&T汇编,通过对8086汇编的学习包括对...

网友评论

      本文标题:X86汇编简单练习

      本文链接:https://www.haomeiwen.com/subject/ltolaftx.html