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技术站