在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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)