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

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日

相关文章

  • 浅谈C语言数组元素下标为何从0开始

    关于C语言数组元素下标为何从0开始的问题,经过长期的发展和实践,现在已经成为C语言的基本规则之一。在这里,我将详细讲解为什么C语言数组下标从0开始,以及这种方式的优势和成本。 为什么C语言数组元素下标从0开始? 在C语言中,数组是一组数据的集合,它们具有相同的类型。数组中的每个元素都有一个唯一的索引,通过该索引可以访问该数组的元素。C语言数组元素下标从0开始…

    C 2023年5月23日
    00
  • C++实现递归函数的方法

    C++中实现递归函数其实是一种函数自我调用的方式。在实现递归函数时,需要注意以下几点: 1.要分清递归的边界条件,一旦达到边界条件,递归函数就不再执行自己。 2.递归的过程中可能会引起栈溢出,为此需要设置递归函数的最大递归次数,避免无限递归。 以下是实现递归函数的详细步骤: 1.编写递归函数的函数体 递归函数的函数体即为要实现的递归过程。在函数体中需要使用到…

    C 2023年5月22日
    00
  • phpcms缓存使用总结(memcached、eaccelerator、shm)

    PHPcms缓存使用总结 PHPcms 是一个基于 PHP 的开源 CMS(内容管理系统),支持各种数据库,并拥有完善的权限管理、缓存等功能。缓存是提高 PHP 程序性能的重要手段之一,下面我们就来详细讲解一下 PHPcms 缓存的使用总结。 1. 缓存类型介绍 PHPcms 有多种缓存类型可供选择,包括:memcached、eaccelerator、shm…

    C 2023年5月22日
    00
  • JSON 基本使用教程

    JSON 基本使用教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读并编写,便于机器解析和生成。它基于JavaScript语言的一个子集,因此它的使用十分广泛。本文将详细讲解JSON的使用。 1. 数据结构 JSON的数据结构只包含以下两种类型: 对象(Object):由花括号{}包含,键值对之间用逗…

    C 2023年5月23日
    00
  • js字符串转成JSON

    假设我们有一个字符串 str,它代表一个 JSON 对象,现在需要把它转成 JavaScript 对象,下面是实现的完整攻略。 1. 将字符串解析成 JSON 对象 使用 JSON.parse() 函数可以将字符串转为 JSON 对象,该函数有一个参数,即要解析的 JSON 字符串。 下面是一个示例: const jsonStr = ‘{"name…

    C 2023年5月23日
    00
  • C语言 break语句

    C语言break语句使用攻略 break语句是C语言中的一种分支语句,用于跳出当前的循环语句或switch语句。本文将详细介绍break语句的使用方法和注意事项。 break语句的基本语法 C语言中break语句的基本语法如下: break; break语句只是一个完整的语句,它可以被任何一个循环语句或switch语句所包含。当执行到break语句时,程序将…

    C 2023年5月9日
    00
  • C语言 指针数组详解及示例代码

    C语言 指针数组详解及示例代码 本文介绍C语言中的指针数组,包括定义和使用方法,以及示例代码。 什么是指针数组? 指针数组是一个数组,其元素都是指针类型。它可以用来存放一系列指向不同数据类型的指针变量。 如何定义指针数组? 定义指针数组需要使用以下语法: type *array_name[size]; 这里的type代表指针指向的数据类型,array_nam…

    C 2023年5月24日
    00
  • Python 对象序列化与反序列化之pickle json详细解析

    Python 对象序列化与反序列化之pickle json详细解析 什么是序列化和反序列化 在计算机科学中,”序列化”是指将数据结构或对象状态转换为可以存储或传输的格式的过程。反之,”反序列化”则是将存储或传输的格式恢复成对象的状态的过程。序列化的一种常见应用是在客户端和服务器之间传输数据。 pickle 序列化和反序列化 Pickle 模块实现了基本的数据…

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