使用 NASM 和 YASM 的“两者”进行 Win64 编程

如何解决使用 NASM 和 YASM 的“两者”进行 Win64 编程

我正在研究如何在 Windows 上编写 x86-64 汇编程序。

我尝试了两个汇编程序——NASM 和 YASM。但是,它们都缺少功能

Some user 建议仅使用 NASM 作为预处理器,然后将结果提供给 YASM。因此,我创建了以下“构建脚本”,它现在似乎可以工作。

@echo off
if "%VSCMD_VER%" == "" call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
@echo on
("D:\nasm-2.15.05\nasm.exe" -E demo.asm -o demo.asm.p
".\yasm-1.3.0-win64.exe" -fwin64 -gcv8 -l demo.lst -o demo.obj demo.asm.p
link.exe /nologo /debug:full /debugtype:cv,pdata,fixup demo.obj)

然而,我觉得自己如履薄冰,一旦尝试做更复杂的事情,我可能会崩溃。

问题::

  1. 当前方案的缺点是什么?有没有这个方案的一些非工作示例?
  2. 是否可以让 NASM 宏像 YASM 一样提供堆栈展开信息?
  3. 我应该改用 MASM 吗? NASM/YASM 不是用于 win64 编程的正确工具吗?由于 Linux 编程,我对 NASM 语法有些熟悉,但我不确定 MASM。

作为参考,这里是我的汇编源代码——用 NASM 宏包装 UCRT vfprintf。

default rel
extern __acrt_iob_func
extern __stdio_common_vfprintf
extern ExitProcess

section .drectve
db "/subsystem:console",0
db "/defaultlib:ucrt",0
db "/defaultlib:kernel32",0
db "/entry:entry",0

%macro printf 1-*
%push printf
%assign %$index 40

mov ecx,1
call __acrt_iob_func
mov rcx,0x24
mov rdx,rax
lea r8,[%1]
xor r9,r9
lea rax,[rsp+40]
mov [rsp+32],rax

%rep %0-1
%defstr %$param %2
%substr %$reltest %$param 1,3
%if %$reltest == "rel"
lea rax,[%2]
%else
mov rax,%2
%endif
mov [rsp+%$index],rax
%assign %$index %$index+8
%rotate 1
%endrep

call __stdio_common_vfprintf
%pop
%endmacro


section .rdata
entry.str: db "The data are %d and %f and %s",0x0d,0x0a,0
entry.sstr: db "HiAll",0

section .text
global entry

proc_frame entry

push_reg rbp
alloc_stack 64
set_frame rbp,64
end_prolog

printf .str,19,23.0,rel .sstr

xor ecx,ecx
call ExitProcess

lea rsp,[rbp]
pop rbp
ret

endproc_frame

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?