64位程序怎么用汇编写
最近在学汇编,都是用dosbox测试程序,没什么意义,不能直接运行,提示windows是64位的不行。我想问在64位环境下怎么用汇编写程序别说要我在C语言内联汇编,测试可...
最近在学汇编,都是用dosbox测试程序,没什么意义,不能直接运行,提示windows是64位的不行。我想问在64位环境下怎么用汇编写程序
别说要我在C语言内联汇编,测试可行的加分 展开
别说要我在C语言内联汇编,测试可行的加分 展开
1个回答
展开全部
用汇编写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
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询