汇编版的的HELLO WORLD

文章展示了一个用80386汇编语言编写的简单的HelloWorld程序,通过调用WindowsAPI函数GetStdHandle、WriteConsoleA和ExitProcess来实现输出到控制台。程序首先定义了相关API的原型,然后在数据段定义了字符串和变量,最后在代码段中执行操作。读者需要使用VisualStudio的命令行工具进行编译(ml/c/coffhello.asm)、链接(link/subsystem:consolekernel32.libuser32.libhello.obj)以及运行生成的可执行文件(hello.exe)。
.386
.model flat, stdcall

GetStdHandle PROTO,         			; get standard handle
	nStdHandle:DWORD  					; type of console handle
	
WriteConsoleA PROTO,					; write a buffer to the console
	hConsoleOutput:DWORD,				; output handle
	lpBuffer:PTR BYTE,					; pointer to buffer
	nNumberOfCharsToWrite:DWORD,		; size of buffer
	lpNumberOfCharsWritten:PTR DWORD,	; ptr to number of bytes written
	lpReserved:DWORD					; (not used)
	
ExitProcess PROTO,          			; exit program
	dwExitCode:DWORD					; return code

.data
prompt BYTE "HELLO WORLD",0
consoleOutHandle DWORD ?    			; handle to standard output device
bytesWritten DWORD ?

STD_OUTPUT_HANDLE EQU -11

.code
main PROC
	INVOKE GetStdHandle, STD_OUTPUT_HANDLE
	mov [consoleOutHandle],eax
	mov edx, OFFSET prompt
	mov eax, 11
	INVOKE WriteConsoleA,
	    consoleOutHandle,     	; console output handle
	    edx,					; points to string
	    eax,					; string length
	    OFFSET bytesWritten,  	; returns number of bytes written
	    0
		
	INVOKE ExitProcess,0
main ENDP
END main

将以上代码保存为helloworld.asm
运行要求:
下载Visual Studio,安装C++
安装好以后,打开该命令行
在这里插入图片描述
在命令行中输入以下命令:
分别是编译,链接,运行,即可

ml /c /coff helloworld.asm
link /subsystem:console kernel32.lib user32.lib helloworld.obj
helloworld.exe
在不同环境和架构下,使用汇编语言编写hello world程序的方法不同。 在X86架构且存在操作系统的Linux环境中,可使用GNU汇编语法编写Hello World程序,编译并运行的命令如下: ```bash gcc -o helloworld helloworld.s ./helloworld echo $? ``` 需要注意,同样的系统调用函数,在32位系统和64位系统里,其调用号不一样,因为使用的是不同的系统调用表 [^2]。 在DOS环境下,编写并运行hello world程序的步骤如下: 1. 使用编译器敲入hello world代码,将文件保存为.asm格式放到桌面或者和必要的文件一起放在C盘的根目录下。 2. 打开DOSBox,开始显示为z:> ,转到C盘,开始显示为C:> 。 3. 进入到C盘根目录下的dasm文件夹内进行操作。 4. 编译hello文件,链接hello文件,执行hello文件,命令如下: ```plaintext masm hello.asm link hello.obj hello.exe ``` 此过程中.obj和.exe文件由上一步操作生成,操作中会有错误提示“LINK:warning L4021: no stack segment”,且最后打印出来的hello world前面有一段乱码。解决方法如下: ```plaintext masm hello.asm link hello.obj/tiny hello.com ``` 执行过程中仍会有错误提示,但两次均不影响结果 [^3]。 还有一种汇编代码实现hello world的方式,代码如下: ```asm ASSUME CS:CODESG,DS:DATASG,SS:STACKSG DATASG SEGMENT STR DB 'HELLO WORLD!','$' DATASG ENDS STACKSG SEGMENT DB 16 DUP (0FFh) STACKSG ENDS CODESG SEGMENT START: MOV AX,DATASG MOV DS,AX MOV AX,STACKSG MOV SS,AX MOV AX,010H MOV SP,AX MOV DX,OFFSET STR MOV AX,0900H INT 21H MOV AX,4C00H INT 21H CODESG ENDS END START ``` 此代码定义了数据段、栈段和代码段,实现了输出“HELLO WORLD!”的功能 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值