linux - "Hello World"函数不使用 C printf

标签 linux assembly x86 nasm

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 并调用 Cprintf 函数(参见下面的代码)- 我不想要那个。我想学习在不使用 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/

相关文章:

mysql - Hibernate 不会在不同的操作系统下加载某些表

c++ - BSF 操作码不工作

php - 如何通过 proc_open 后台进程并访问 STDIN?

linux - 创建多个子进程时出现问题

linux - 从巨大的 txt.gz 文件中选择/复制包含字符串的行的最快方法

c++ - 使用带有嵌套结构的模板化 lambda 时的类型推导 + 分析可能未使用的程序集输出

对这个 Y86 汇编代码的内存位置感到困惑

assembly - 有人可以解释一下 PPC 分支链接吗

c - 错误 : invalid 'asm' : operand number missing after %-letter

assembly - 为什么汇编指令可以在 "lea"指令中包含乘法?