为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Windows下用汇编程序编写Hello World?

/ 猿问

如何在Windows下用汇编程序编写Hello World?

翻阅古今 2019-07-26 19:14:30

如何在Windows下用汇编程序编写Hello World?

我想在Windows下编写一些基本的汇编语言,我正在使用NASM,但是我不能让任何东西工作。

如何在Windows上不借助C函数编写并编译Hello World?



查看完整描述

3 回答

?
不负相思意

NASM实例.

调用libc stdioprintf,实施int main(){ return printf(message); }

; ----------------------------------------------------------------------------; helloworld.asm;; This is a Win32 console program that writes "Hello, World" on one line and; then exits.  It needs to be linked with a C library.; ----------------------------------------------------------------------------

    global  _main    extern  _printf

    section .text
_main:
    push    message
    call    _printf
    add     esp, 4
    ret
message:
    db  'Hello, World', 10, 0

那就跑

nasm -fwin32 helloworld.asmgcc helloworld.obj
a

还有纳玛斯的“哈罗世界指南”不用C库。代码就会像这样。

使用MS-DOS系统调用的16位代码:在DOS模拟器中工作,或者在32位Windows中使用NTVDM支持..不能在任何64位Windows下“直接”运行(透明),因为x86-64内核不能使用vm 86模式。

org 100hmov dx,msg
mov ah,9int 21hmov ah,4Chint 21hmsg db 'Hello, World!',0Dh,0Ah,'$'

将此构建为.com可执行文件,以便将其加载到cs:100h在所有段寄存器相等的情况下(微型内存模型)。

祝好运。




查看完整回答
反对 回复 2019-07-27
?
慕后森

此示例演示如何直接转到WindowsAPI,而不是在C标准库中链接。

    global _main    extern  _GetStdHandle@4
    extern  _WriteFile@20
    extern  _ExitProcess@4

    section .text
_main:
    ; DWORD  bytes;    
    mov     ebp, esp    sub     esp, 4

    ; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
    push    -11
    call    _GetStdHandle@4
    mov     ebx, eax    

    ; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push    0
    lea     eax, [ebp-4]
    push    eax
    push    (message_end - message)
    push    message
    push    ebx
    call    _WriteFile@20

    ; ExitProcess(0)
    push    0
    call    _ExitProcess@4

    ; never here
    hlt
message:
    db      'Hello, World', 10message_end:

要编译,您需要NASM和LINK.EXE(来自VisualStudioStandardEdition)

   nasm -fwin32 hello.asm
   link /subsystem:console /nodefaultlib /entry:main hello.obj



查看完整回答
反对 回复 2019-07-27
?
慕盖茨1488219

这些是使用WindowsAPI调用的Win 32和Win 64示例。他们是为MASM而不是NASM,但看看他们。您可以在这,这个文章。

;---ASM Hello World Win32 MessageBox.386.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib.data
title db 'Win32', 0msg db 'Hello World', 0.codeMain:push 0            ; uType = MB_OK
push offset title ; LPCSTR lpCaption
push offset msg   ; LPCSTR lpText
push 0            ; hWnd = HWND_DESKTOP
call MessageBoxApush eax          ; uExitCode = MessageBox(...)call ExitProcessEnd Main;---ASM Hello World Win64 MessageBoxextrn MessageBoxA: PROC
extrn ExitProcess: PROC.data
title db 'Win64', 0msg db 'Hello World!', 0.code
main proc  sub rsp, 28h  
  mov rcx, 0       ; hWnd = HWND_DESKTOP
  lea rdx, msg     ; LPCSTR lpText
  lea r8,  title   ; LPCSTR lpCaption
  mov r9d, 0       ; uType = MB_OK
  call MessageBoxA
  add rsp, 28h  
  mov ecx, eax     ; uExitCode = MessageBox(...)
  call ExitProcessmain endpEnd


若要使用MASM组装和链接这些文件,请将其用于32位可执行文件:

ml.exe [filename] /link /subsystem:windows 
/defaultlib:kernel32.lib /defaultlib:user32.lib /entry:Main

或者对于64位可执行文件:

ml64.exe [filename] /link /subsystem:windows 
/defaultlib:kernel32.lib /defaultlib:user32.lib /entry:main


查看完整回答
反对 回复 2019-07-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信