📜  在不使用任何头文件的情况下,在C C++中打印“ Hello World”(1)

📅  最后修改于: 2023-12-03 15:07:57.102000             🧑  作者: Mango

在不使用任何头文件的情况下,在C/C++中打印“Hello World”

在C/C++中,可以使用printf()函数来进行输出。但是,如果我们不使用任何头文件,该如何输出呢?下面是一些方法:

1. 使用汇编

汇编语言可以直接与CPU交互,因此可以直接输出字符串到终端。以下是一个汇编程序,可以输出“Hello World”到终端:

section .data
    msg db 'Hello World',0xA     ;定义字符串
    msglen equ $-msg             ;求字符串长度

section .text
    global _start

_start:
    mov eax, 4                   ;将系统调用号4(写文件)放入eax寄存器
    mov ebx, 1                   ;将文件描述符(终端)放入ebx寄存器
    mov ecx, msg                 ;将要输出的字符串地址存入ecx寄存器
    mov edx, msglen              ;将要输出的字符串长度存入edx寄存器
    int 0x80                     ;调用系统调用
    mov eax, 1                   ;将系统调用号1(退出程序)放入eax寄存器
    xor ebx, ebx                 ;将退出码(返回0)放入ebx寄存器
    int 0x80                     ;调用系统调用,退出程序

这份汇编代码使用了Linux下的系统调用,因此需要在Linux下编译运行。可以使用以下命令进行编译:

nasm -f elf64 -o hello.o hello.asm
ld -o hello hello.o
2. 使用宏

在C预处理器中,可以定义和使用宏。因此可以使用宏来输出字符串。以下是一个使用宏的示例代码:

#define print(s) write(1, s, sizeof(s)-1)

void _start()
{
    print("Hello World\n");
    _exit(0);
}

使用宏的思路是,定义一个名为print的宏,宏的作用是调用write()函数输出字符串。这样在代码中,就可以像调用函数一样使用print()来输出字符串了。

3. 使用裸程序

在不依赖于操作系统的情况下,可以在处理器中运行一段二进制代码,这就是裸程序。在裸程序中,可以使用BIOS的中断来输出字符。以下是一个使用裸程序的示例代码:

[BITS 16]

section .text

    global _start

_start:
    mov ax, 0xB800
    mov es, ax
    mov di, 0

    ; 打印字符'H'
    mov ax, 0x0748
    mov word [es:di], ax
    add di, 2
    
    ; 打印字符'e'
    mov ax, 0x1F65
    mov word [es:di], ax
    add di, 2

    ; 打印字符'l'
    mov ax, 0x726C
    mov word [es:di], ax
    add di, 2

    ; 打印字符'l'
    mov ax, 0x6C6F
    mov word [es:di], ax
    add di, 2

    ; 打印字符'0'
    mov ax, 0x0020
    mov word [es:di], ax
    add di, 2
    
    jmp $

    times 510 - ($ - $$) db 0
    dw 0xAA55

这份代码使用了汇编语言来编写裸程序。使用了BIOS的中断来显示字符,这样可以在任何没有操作系统的环境下运行。

结语

以上是在不使用任何头文件的情况下,在C/C++中打印“Hello World”的三种方法。这些方法在实际生产环境中并不实用,但是可以展示C/C++语言的一些特性和使用场景。如果您有更好的方法,欢迎评论区留言。