8086怎么输出数组_用汇编语言输出Hello World!

f4b6630a549479987c66693f0d700f7e.png

众所周知,首先从输出“Hello World!”开始学习一门编程语言已经是惯例了,汇编语言也不例外,下面我们将从输出“Hello World!”开始学习汇编语言。

一、编写源程序

首先我们尝试用C语言来实现该功能:

#include <stdio.h>

int main() {
    printf("Hello World!"); // 输出“Hello World!”
    return 0;
}

可以看到,仅仅用了一行代码就实现了该功能。那么用汇编语言又该如何去实现呢?

data segment ;数据段
    string db 'Hello,World!$'
data ends
code segment ;代码段
assume cs:code,ds:data
start:
    mov ax,data ;获取段基址
    mov ds,ax ;将段基址送入寄存器
    mov dx,offset string
    mov ah,9
    int 21h
    mov ah,4ch
    int 21h
code ends
end start

下面对该汇编程序的部分代码进行说明:

string db 'Hello,World!$'
定义一个名为string的字符串,string是字符串的名称,db是定义字节说明,字符串内容需用单引号括起,其中 $ 是串的结束标志
assume cs:code,ds:data
这是一条汇编伪指令,含义是指定code段与CS寄存器关联,data段与DS寄存器关联
mov dx,offset string
获取string的偏移地址
mov ah,9
int 21h
调用9号DOS功能(显示字符串 )
mov ah,4ch
int 21h
调用程序结束功能

对比两段代码,显然同样的功能用汇编语言实现起来比用C语言实现起来更加复杂。这是因为汇编语言是低级编程语言,而C语言等是高级编程语言,汇编语言更加接近底层。程序员用汇编语言来编写程序实际上都是对CPU中的寄存器进行操作,汇编语言编程是针对寄存器来进行编程的。

二、对源程序进行编译

汇编语言程序从设计到形成可执行程序文件,在计算机上的操作过程分为三步:编辑、汇编、连接。用文本编辑程序写程序,形成.ASM文件,用汇编程序对.ASM文件进行汇编,形成.OBJ文件,再用连接程序对.OBJ文件进行连接,形成.EXE文件。

1. 编辑

新建一个名为HELLO.ASM的文件,用文本编辑器将源程序写入该文件中。

2. 汇编

汇编程序的作用是把汇编语言源程序翻译成为机器代码,产生二进制格式的目标文件(Object File)

在DOS中输入以下命令:

MASM HELLO.ASM

3. 连接

连接就是使用连接程序LINK把目标文件(OBJ)转换为可执行的EXE文件

在DOS中输入以下命令:

LINK HELLO.OBJ

三、在Debug模式下调试程序

程序必须经过调试阶段,才能观测结果和发现程序中的错误。

在DOS中输入以下命令:

debug hello.exe

用Debug调入HELLO.EXE,出现-Debug命令提示符。在-后可键入Debug命令进行调试。

四、运行程序

在DOS中输入以下命令:

hello.exe

运行结果:

2683ef3062190e2b35ed8489ca1e5ae0.png
运行结果
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是使用 C 和内嵌汇编Hello World 程序的示例: ``` #include <stdio.h> int main(void) { char *str = "Hello, World!"; asm("movl $13, %%edx\n\t" "movl %0, %%ecx\n\t" "movl $0, %%ebx\n\t" "movl $4, %%eax\n\t" "int $0x80" : : "r"(str) : "%eax", "%ecx", "%edx"); return 0; } ``` 在这个程序中,我们使用了内嵌的汇编语言代码来调用 Linux 系统调用 `write`,它将字符串 "Hello, World!" 输出到标准输出。 注意,内嵌汇编是一种高级技术,在 C 程序中使用内嵌汇编时需要小心。常见问题包括寄存器修改和硬编码的系统调用号。 这里只是简单的示例,实际使用时可能需要更复杂的代码。 ### 回答2: 使用C语言和内嵌汇编语言编写"Hello World"程序是一种常见的方法,以下是一个简单的示例: ```c #include <stdio.h> int main() { char message[] = "Hello World!"; asm volatile ( "movl $4, %%eax\n\t" // 使用汇编指令设置系统调用号为4,表示write "movl $1, %%ebx\n\t" // 将文件描述符设置为1,表示将内容入标准输出 "movl %0, %%ecx\n\t" // 将message的地址赋给ecx寄存器 "movl $13, %%edx\n\t" // 将消息的长度设置为13,即字符串的长度 "int $0x80" // 使用int 80h来执行系统调用 : : "r" (message) // 将message作为输入的操作数 : "%eax", "%ebx", "%ecx", "%edx" // 对寄存器的使用进行声明,保证寄存器的正确保存 ); return 0; } ``` 上面的程序首先使用C语言声明了一个名为`message`的字符数组,并赋值为"Hello World!"。然后,在`asm volatile`语句块中,使用内嵌汇编语言编写汇编指令序列。这些汇编指令实现了系统调用`write`,将`message`中的内容入标准输出。最后,用C语言的`return`语句返回0,表示程序正常结束。 编译并运行该程序后,将在控制台输出"Hello World!"。需要注意的是,该代码的可移植性较差,因为汇编代码依赖于特定的操作系统和处理器架构。不同的操作系统和计算机架构可能需要使用不同的系统调用和寄存器约定。因此,以上示例仅适用于某些特定的环境。 ### 回答3: 使用C语言和内嵌汇编编写Hello World程序可以通过调用操作系统的系统调用来输出字符串。下面是一个示例的代码: ```c #include <stdio.h> int main() { char *str = "Hello World!"; __asm__ ( "movl $4, %%eax \n\t" // 通过系统调用号4调用write系统调用 "movl $1, %%ebx \n\t" // 将文件描述符1(标准输出)存入ebx寄存器 "movl %0, %%ecx \n\t" // 将字符串的地址存入ecx寄存器 "movl $13, %%edx \n\t" // 将字符串长度存入edx寄存器 "int $0x80" // 触发系统调用 : // 输出部分为空 : "r" (str) // 输入部分为字符串地址 : "%eax", "%ebx", "%ecx", "%edx" // 寄存器被修改 ); return 0; } ``` 这段代码中,通过内嵌汇编使用了Linux系统的汇编指令来调用write系统调用,将字符串"Hello World!"输出到标准输出(文件描述符为1)。 需要注意的是,内嵌汇编法可能因编译器而异,上述代码是使用gcc编译器的内嵌汇编法。执行这段代码,控制台输出应为"Hello World!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值