x64汇编第一课

Posted yy4955

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x64汇编第一课相关的知识,希望对你有一定的参考价值。

x64相关文档:

0.环境
编译器:ml64.exe
技术图片
技术图片

链接器:link.exe
技术图片
cmd选择:这个不要选兼容,不然link不过,不需要配置环境bi
技术图片

1.32位和64位的区别:
1.eax赋值为1,64位的高32位自动补0

mov eax, ffffffff
rax = 0x00000000ffffffff
mov eax,1
    add rax,rax
2.传参的四个寄存器统一规定依次是rcx、rdx、r8、r9
3.64位汇编中声明和定义时都不需要写参数了,64位汇编只需写区,定义变量就好
4.关于抬栈一般按模16,
1.比如传4个参数,正常是4*8=0x20,加上call的反回值寄存器0x20+8,不能模16,+8=0x30,能模16,
MyAdd proc
  sub rsp, 28h
  mov [rsp+30h], ecx ;原本第一个参数地址该是rsp+8h,再加28h,变成rsp+30h
  mov [rsp+38h], edx
  mov eax, ecx
  add eax, edx
  add rsp, 28h
  ret
MyAdd endp
2.多于4个参数的 函数内存结构  mov 【rsp+20h】xx
技术图片

2.64位HelloWord

extern MessageBoxA:proc
extern ExitProcess:proc

includelib user32.lib
includelib kernel32.lib

MB_OK EQU  0

.const
  _MSG:  
      db "Hello x64!", 0dh, 0ah, 0
  _TITLE:
      db "Title", 0
      
.data
  _BUFF: org 260
  
  

.code 




START proc 
  sub   rsp, 28h  ;нц┴З┐Н╝С  sup rsp  add rsp
  

  
  mov   rcx, 0
  mov   rdx, offset _MSG
  mov   r8,  offset _TITLE
  mov   r9,  MB_OK
  call  MessageBoxA  

  mov   rcx, 0
  call  ExitProcess
  add   rsp, 28h
  ret
START endp

 end
 
 
3.编译链接的批处理
ml64 /c hello.asm
link64 /SUBSYSTEM:WINDOWS /ENTRY:START /MACHINE:ARM hello.obj rc2.res

ml64 /c Hello.asm 
link /subsystem:windows /entry:Main Hello.obj




附件列表

     






    以上是关于x64汇编第一课的主要内容,如果未能解决你的问题,请参考以下文章

    x64汇编第一讲,Vs系列配置x64环境与x86环境

    实现 x86 到 x64 汇编代码切换

    x64 汇编中的递归阶乘子例程导致堆栈溢出

    访问 x64 TEB C++ 和汇编

    x86平台转x64平台关于内联汇编不再支持的解决

    VS2012下X64平台嵌入汇编程序