如何在64位系统下运行汇编程序?

如何在64位系统下运行汇编程序?,第1张

前目录中,在命令行下,输入"ml cc.asm"命令,可完成编译和连接。

在masm中,编译是针对源文件的,源文件需为以".asm"为后缀的文本文件。编译产生的是目标文件。而连接是针对目标文件的,目标文件需为编译时产生的,以“.obj”为后缀的二进制文件。连接产生的是以".exe"为后缀的可执行文件。

用汇编写64位程序与32位下有以下几点不同:

1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。

2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出4*8=32个字节的空间,多于四个的参数放入堆栈。

3,函数调用后,由调用者负责堆栈回收。

看一个例子吧:

include \masm64\inc\user32.inc 头文件

includelib \masm64\lib\user32.lib 库文件

.data 定义数据段

strTittle db "Hello",0

strCaption db "How are you",0

.code 代码段

Main proc 入口过程,需在汇编时定义

sub rsp,28H 为前四个参数预留堆栈空间

xor rcx,rcx 第一个参数0放入rcx中

lea rdx,strCaption 把要显示的字符串地址做为第二个参数放入rdx中

lea r8,strTittle把消息框的标题字符串地址做为第三个参数放入r8中

xor r9,r9把第四个参数0 放入r9中

call MessageBoxA 调用MessageBoxA函数

add rsp,28H 堆栈清理

ret返回

Main ends

end

disp proc near 显示16进制数(字母大写)子程序,入口:BX寄存器存有二进制待显示数

mov dl,bh

mov cl,4

shr dl,cl

cmp dl,10

jc hex1

add dl,30h

hex1: add dl,37h

mov ah,02h

int 21h

mov dl,bh

and dl,0fh

cmp dl,10

jc hex2

add dl,30h

hex2: add dl,37h

mov ah,02h

int 21h

mov dl,bl

mov cl,4

shr dl,cl

cmp dl,10

jc hex3

add dl,30h

hex3: add dl,37h

mov ah,02h

int 21h

mov dl,bl

and dl,0fh

cmp dl,10

jc hex4

add dl,30h

hex4: add dl,37h

mov ah,02h

int 21h

mov dl,48h

mov ah,02h

int 21h

ret

disp endp


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11501523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存