我想在Windows下编写基本的程序集,我正在使用NASM,但我无法正常工作.
如何在Windows上没有C函数的帮助下编写和编译hello world?
我是这里的新手,刚刚开始学习汇编语言.所以,如果我错了,请纠正我,或者如果这篇文章没有任何意义我会删除.
我在讨论x86-64英特尔架构中的数据移动指令.我已经读过,常规movq指令只能有直接的源操作数,可以表示为32位二进制补码数,而movabsq指令可以有任意64位立即数作为其源操作数,并且只能有一个寄存器作为目标.
你能详细说明一下吗?这是否意味着我只能使用movabsq指令移动64位立即值?只有立即价值到登记册?我不知道如何将64位立即值移动到内存中.或者也许我错了一些重要的事情.
我使用 Visual Studio 2017 编译了一个简单的程序
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用命令行编译
cl 1.cpp /Fa1.asm
Run Code Online (Sandbox Code Playgroud)
这给了我(大部分)对我有意义的汇编代码
; Listing generated by Microsoft (R) Optimizing Compiler Version 19.14.26429.4
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
CONST SEGMENT
$SG5542 DB 'hello, world', 0aH, 00H
CONST ENDS
PUBLIC ___local_stdio_printf_options
PUBLIC __vfprintf_l
PUBLIC _printf
PUBLIC _main
PUBLIC ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA ; `__local_stdio_printf_options'::`2'::_OptionsStorage
EXTRN ___acrt_iob_func:PROC
EXTRN ___stdio_common_vfprintf:PROC
; COMDAT ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA
_BSS SEGMENT
?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA DQ 01H DUP (?) ; `__local_stdio_printf_options'::`2'::_OptionsStorage
_BSS ENDS
; Function compile flags: /Odtp
_TEXT …Run Code Online (Sandbox Code Playgroud) 我真的需要一些帮助。我已经在网上搜索了大约 2 天,似乎无法找到我遇到的问题的答案。
我下载了 nasm 并安装了它,它似乎可以工作,但我似乎找不到任何适用于 Windows 64 位的示例代码(如果你能为我或其他东西制作一个简单的 hello world 示例,那就太棒了)。(以及如何编译它)
我如何将 .o 文件变成 .exe?
我将如何访问屏幕或 GPU 内存(我认为)以在屏幕上打印内容(例如某种控制台应用程序)?