Linux折腾记(八):使用GCC和GNU Binutils编写能在x86实模式运行的16位代码

yizhihongxing

Linux折腾记(八)的主题是如何使用GCC和GNU Binutils编写能在x86实模式运行的16位代码。针对这个主题,我们可以分为以下几步。

步骤1:准备工作

在开始编写代码之前,我们需要安装在Ubuntu系统上安装GCC和GNU Binutils。可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install build-essential

这两个程序包可以在Ubuntu软件仓库中找到。我们需要将编写的代码保持为16位的x86汇编代码。

步骤2:编写代码

在本文中,我们将编写一个短小的程序,用于在屏幕上打印“Hello World!”。以下是代码示例:

section .text
    global _start

_start:
    ;设置页面为视频模式
    mov ax, 0x03    
    int 0x10
    ;设置打印字符信息
    mov ah, 0x0E    
    mov bx, 0x0007  
    mov al, 'H'     
    int 0x10
    mov al, 'e'     
    int 0x10
    mov al, 'l'     
    int 0x10
    mov al, 'l'     
    int 0x10
    mov al, 'o'     
    int 0x10
    mov al, ' '     
    int 0x10
    mov al, 'W'     
    int 0x10
    mov al, 'o'     
    int 0x10
    mov al, 'r'     
    int 0x10
    mov al, 'l'     
    int 0x10
    mov al, 'd'     
    int 0x10
    mov al, '!'     
    int 0x10
    ;循环退出;如果要自动退出程序,将bx的值改为0x0006
    mov ax, 0x4C00  
    int 0x21

这段代码包括两部分。第一部分是_section .text_,这是在代码段中显示指定的区域,这意味着这里将放置代码。第二部分是_start_。这是程序的入口点。请注意,此标记前有_global_指令,表明该标记将在整个程序中可用。执行在_start标记下的代码将是我们的程序所做的第一件事情。

步骤3:编译代码

编译十分简单,使用下面的命令即可生成可执行文件myfirst.exe:

nasm -f elf -o myfirst.o myfirst.asm
ld -m elf_i386 myfirst.o -o myfirst.exe

在上面的命令中,我们使用nasm编译器将汇编代码文件转换为16位机器代码对象,然后使用GNU链接器将对象文件连接到可执行文件中。

步骤4:运行程序

在64位系统上,您可能需要使用_dosbox_来运行程序。可以使用以下命令在_dosbox_中运行我们的程序:

dosbox myfirst.exe

此时,我们将在屏幕上看到"Hello World!"这个字符串。该程序将等待用户按任意键退出。

如果您不想手动输入_dosbox_中断,请可以将程序更改为自动退出。请将最后一个int 0x21调用更改为:int 0x21和bx的值为0x0006。

以上是简要的示例说明,您可以运用这些知识,编写出其他更实用的程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux折腾记(八):使用GCC和GNU Binutils编写能在x86实模式运行的16位代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 浅析Linux下精确控制时间的函数

    浅析Linux下精确控制时间的函数 在Linux下,我们可以使用一些函数来精确地控制时间。本文将介绍其中常用的三个函数,分别是gettimeofday(), clock_gettime(), usleep()。 gettimeofday() int gettimeofday(struct timeval *tv, struct timezone *tz); …

    C 2023年5月22日
    00
  • 计时器的time_t和clock_t 的两种实现方法(推荐)

    计时器的time_t和clock_t的两种实现方法(推荐) 计时器是一个非常实用的工具,在很多应用场景中都得到了广泛的应用。time_t和clock_t是两种常见的计时器类型,它们都可以用于测量时间的长度。本文将详细介绍这两种类型的实现方法,以供大家参考。 time_t的实现方法 time_t是标准C库中的一种数据类型,它代表了从1970年1月1日零时整到给…

    C 2023年5月23日
    00
  • Win11系统遇到BSOD错误代码0xc0000001怎么办 附图文修复教程

    当 Win11 系统遇到 BSOD 错误代码 0xc0000001 的时候,这意味着操作系统自举的过程中发生了错误。这种错误可能是由于硬件故障、软件冲突、缺失关键系统文件等多种原因引起的。 下面是对此问题的解决攻略: 步骤一:检查硬件连接 首先,确保 Win11 计算机的每个硬件部件都正确连接。此外,请确保所有硬件部件都处于工作状态并适当地供电。如果其中某一…

    C 2023年5月23日
    00
  • C++中的常用库

    下面是关于C++中常用库的完整攻略。 C++中的常用库 C++是一种高效、快速、通用的计算机语言。在C++中,有许多常用的库可供使用,从而使您的编程工作更加轻松和高效。 iostream库 Iostream库是c++中经常使用的标准输入输出库。它提供了对标准输入、标准输出和标准错误的支持,同时也提供文件输入输出支持。以下是一个简单的例子: #include …

    C 2023年5月22日
    00
  • 整理AngularJS框架使用过程当中的一些性能优化要点

    当在使用AngularJS框架进行开发的过程中,需要注意性能优化,以避免应用程序出现延迟和卡顿现象。下面是整理AngularJS框架使用过程中的一些性能优化要点的攻略。 1. 使用一次性绑定语法 使用AngularJS的双向数据绑定特性时,会引发监听器的频繁触发,影响应用的性能。AngularJS推荐使用一次性绑定语法”{{::expression}}”,它…

    C 2023年5月22日
    00
  • Go程序员踩过的defer坑错误处理

    当Go程序员使用错误处理时,defer语句非常有用,这将确保特定的函数调用在发生意外情况时执行。然而,错误处理和defer语句的组合在某些情况下可能会导致不期望的结果。接下来就来详细讲解Go程序员踩过的defer坑错误处理的完整攻略。 错误处理与defer语句的组合 通过错误处理,程序员可以判断何时出现了问题,并采取相应的措施来解决这些问题。错误处理如果与d…

    C 2023年5月23日
    00
  • VS2019中在源文件中如何使用自己写的头文件

    当我们需要在源文件中使用自己写的头文件时,需要经过以下步骤: 进入Visual Studio 2019,打开需要使用头文件的源文件。 在源文件所对应的项目中,新建一个头文件(以.h为后缀)并将需要封装的函数和变量写入该头文件中,如下所示: //mypackage.h #ifndef MY_PACKAGE_H #define MY_PACKAGE_H #inc…

    C 2023年5月23日
    00
  • C语言实现文件读写

    文件读写是C语言的一个重要部分,文件读写操作主要是通过函数库提供的各种操作文件的函数来实现的。在实现文件读写时,主要分为以下几个步骤: 打开文件 C语言提供了fopen函数来打开文件,并返回一个指向文件的指针,该函数原型如下: FILE *fopen(const char *filename, const char *mode); 其中,filename表示…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部