首页 > 编程语言 >64位系统下的内联汇编

64位系统下的内联汇编

时间:2024-03-25 14:44:17浏览次数:11  
标签:28h 调用 汇编 mov 64 内联 rsp asm

64位asm内联汇编

1、创建一个源文件asm.asm
2、asm文件属性设置
image.png
3、自定义生成工具设置:

ml64 /c %(filename).asm

%(filename).obj;%(Outputs)

image.png
asm代码模板

EXTERN  myprint:PROC  ;引用外部函数
EXTERN  g_iValue:DQ   ;引用外部变量,dq是QWORD,8字节的变量

.DATA
val1 DQ ?;自己定义变量

.CODE

func2 PROC
    sub rsp,28h  ; 这个地方可能是为了栈空间对齐,不这样做有可能会崩掉,原因未知。反正反汇编一x64的代码都有这个东西
	call myprint
	mov r10,g_iValue ; 此处使用中的stdafx.h全局变量。
    mov val1,r10  ; 使用自定义的变量
    mov rax,val1 ; 写入返回值
	add rsp,28h
	ret
FUNC2 ENDP
END

在汇编中调用winapi

有时候需要在汇编中调用windows的64位的API,在调用API之前首先要明白函数调用约定。
在32位系统中我们调用的用户态API一般都遵循WINAPI(__stdcall)的调用约定,主要规则有两条: 1. 函数参数由右向左入栈;2. 函数调用结束后由被调用函数清除栈内数据(其实是被调者参数的清除)。所以在调用一个遵循WINAPI的函数之后,不需要自己来做被调函数栈空间的清除,因为被调函数已经恢复过了。而在x64汇编中,两方面都发生了变化。一是前四个参数分析通过四个寄存器传递:RCX、RDX、R8、R9,如果还有更多的参数,才通过椎栈传递。二是调用者负责椎栈空间的分配与回收。

INCLUDELIB kernel32.lib ; 告诉连接器链接这个动态库
EXTERN MessageBoxA:PROC  ; 引用 MessageBoxA函数

.DATA
; 定义局部变量
szCaption   db  '恭喜',0  
szText      db  '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0  

.CODE
func2 PROC
    sub rsp,28h
    mov rcx, 0
    mov rdx, offset szText;
	mov r8, offset szCaption
    mov r9, 0
    call MessageBoxA 
	add rsp,28h  
	ret
FUNC2 ENDP
END

sub rsp,28h是为了给被调用函数的参数和返回地址预留栈空间

标签:28h,调用,汇编,mov,64,内联,rsp,asm
From: https://www.cnblogs.com/xiaoxin07/p/18094360

相关文章

  • Base64编解码及C++代码实现
    1.Base64是什么?        Base64是一种二进制到文本的编码方式。如果要更具体一点的话,可以认为它是一种将byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。        例如字符串mickey0380对应的Base64为bWlja2V5MDM4MA==。其中那个=......
  • 从高级语言到汇编语言(MIPS)
    从高级语言到汇编语言(MIPS)C语言是如何转化为汇编语言的?这一步在电脑中是由汇编程序完成的,但是了解C语言到汇编语言的转换过程有利于我们更好的编写出性能更加优异的程序,因此下面我将逐步介绍从C到MIPS的核心思想和实现步骤。一、存储结构核心:在MIPS中,所有的操作数必须来......
  • 汇编语言——实现用多种寻址方式在屏幕上显示“hello world !“
    ;数据段定义datasegment stringdb"helloworld!",0dh,0ah,'$' ;想要显示的字符个数,不显示$ countdw$-string-1dataends;堆栈段定义stacksegmentstack toplabelword dw30hdup(?)stackends;代码段定义codesegment ;assum伪指令,不执行 ass......
  • 拓扑排序 洛谷B3644家谱树解法
    #include<bits/stdc++.h>usingnamespacestd;intd[101];//d[i]表示i点的入度个数intt[101][101];//t[i][j]表示i点到j点间有一条有向边queue<int>q;//q表示当前入度为0的节点intmain(){ //所有数组初始化为0 memset(d,0,sizeof(d)); memset(t,0,sizeof(t......
  • aida64
    目录aida64记录aida64.exe程序信息IDRTForm_EnterProductKey_UpdateScreencheck_F85B98pyaida64记录最近换了电脑,微星主板带了aida64程序,结果只能试用60天0.0aida64.exe程序信息32位程序,编译器:BorlandDelphi(7)[-]IDRDelphi程序直接祭出大杀器IDR定位注册窗口和注......
  • 初识C++(二)引用,内联函数,auto
    目录1.引用的概念与用法:1.1引用特性:1.2使用场景    1.2.1做参数1.3传值、传引用效率比较1.4引用做返回值1.5引用和指针的对比2.内联函数3.auto关键字4.基于范围的for循环(C++11)5.指针空值nullptr(C++11)1.引用的概念与用法:    引用是一个重要的......
  • 计算机基础系列 —— 汇编语言
    Samehardwarecanrunmanydifferentprograms(Software)文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。我们在之前的文章里,构建了Register、RAM和ALU,使得我们有了存储和计算的能力,我们接着借助之前的组合逻辑单元和时序......
  • ARM64: ARDP
    1指令语法ardp<Xd>,<lable>2指令语义1获取程序计数器PC寄存器的值;2将PC寄存器值的低12位全部取0;3将lable的值乘以4096,也就是将label左移12位;4将第2步的PC值与第3步的label值相加;5将第4步所得结果写入寄存器Xd。从上面步骤可以看出,得到的结果低12位为0,所以得到......
  • P5648 Mivik的神力
    P5648Mivik的神力卡常倍增或树状结构维护想了好久也没思路。首先很容易发现维护静态区间max是很容易的(st表),但是仍然不能快速维护前缀max和。考虑前缀max的性质。首先前缀max的值是单调递增的,对于前缀max序列,可以将其分成若干个内部相等的段。也就是对于每个数\(a_i\)......
  • 字符串转base64或二进制
    /***字符串转base64*@paramstr*@returns*/functionmyEncode(str){////对字符串进行编码varencode=encodeURI(str.replace(/\+/g,'躞'));//+在后台转明文会丢////对编码的字符串转化base64varbase64=btoa(encode);......