UPDATED
这是我使用 NASM
的第二天。深入了解这一点后
section .programFlow
global _start
_start:
mov edx,len
mov ecx,msg
mov ebx,0x1 ;select STDOUT stream
mov eax,0x4 ;select SYS_WRITE call
int 0x80 ;invoke SYS_WRITE
mov ebx,0x0 ;select EXIT_CODE_0
mov eax,0x1 ;select SYS_EXIT call
int 0x80 ;invoke SYS_EXIT
section .programData
msg: db "Hello World!",0xa
len: equ $ - msg
我想将这些东西包装在一个汇编函数中。网络上的所有(或大部分)示例都使用 extern
并调用 C
的 printf
函数(参见下面的代码)- 我不想要那个。我想学习在不使用 C
printf
(甚至其他外部函数调用)的情况下在汇编中创建一个“Hello World”函数。
global _main
extern _printf
section .text
_main:
push message
call _printf
add esp, 4
ret
section .data
message: db "Hello, World", 10, 0
更新
我正在练习 Linux 汇编,但由于我没有 Linux 机器,所以我在这里运行我的汇编代码 compile_assembly_online .
最佳答案
假设您的意思是在 Windows 命令提示符环境中写入标准输出:
由于它们提供了旧 DOS 环境的虚拟化版本,我相信您可以为它使用旧 DOS 中断:
int 21, function 9可以输出字符串:设置AH为9,DS:DX为以$
结尾的字符串,触发中断。
int 21, function 2可以输出单个字符,因此如果您需要输出 $
(或者您不想要 Ctrl+C 和此类检查),您可以重复使用它。 AH转2,DL转ASCII(我期望的)字符码,触发中断。
关于linux - "Hello World"函数不使用 C printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22280998/