前言:
今天1024耶!首先,祝大家节日快乐!!!
文章主题是敲下第一行汇编语言的代码,什么?你还不会写汇编语言的helloworld?觉得参数字符太多,那没事,框架直接给你,复制粘贴即可,在那之前,让我们一起了解一些东西。
我觉得一个优秀的程序员是一定要学习汇编语言和编译原理的,即使很多人觉得汇编语言已经不实用了(因为大都在使用高级语言,忽略了它的重要地位),但是从机器层面来说,除了我们的机器语言,汇编语言可以更好的让我们从底层去了解关于计算机的知识,关于我们现在使用高级语言的知识。很多时候我们和大佬的差距,往往在于底层的计算机知识:计算机组成原理、操作系统、计算机网络。当你知道的底层知识越多,在高级语言等上层封装抽象的东西就更加有底气。
一、给出模板(直接复制粘贴即可使用)
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
INCLUDE io.h ; header file for input/output
cr EQU 0dh ; carriage return character
Lf EQU 0ah ; line feed
.STACK 4096 ; reserve 4096-byte stack
.DATA ; reserve storage for data
//在这里定义变量
.CODE ; start of main program code
_start:
//在这里写代码
INVOKE ExitProcess, 0 ; exit with return code 0
PUBLIC _start ; make entry point public
END ; end of source code
二、模板解析
.386 //指明指令集
.MODEL FLAT //程序工作模式, flat为Windows程序使用的模式(代码和数据使用同一个4GB段)
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD //是一个指示性语句。Proto用来产生一个函数,函数名字是:ExitProcess,用于结束程序的系统函数。它有一个参数Dword类型的。
INCLUDE io.h ; //指示汇编器拷贝一文件io.h到程序中
cr EQU 0dh ; //符号赋值语句,用符号代替数值使用。0dh回车符
Lf EQU 0ah ; //0ah 换行符,这个是ascall码
.STACK 4096 ; //指示汇编器运行时堆栈要保留多少字节,通常是保留4096个字节
.DATA ; //程序数据段的开始,该数据段中保留了变量的内存空间。
.CODE ; //标识这个程序的入口,即第一条要执行的语句的地址。
_start:
INVOKE ExitProcess, 0 ; //调用子过程ExitProcess的指令,它的功能是终止这个程序。
PUBLIC _start ; //文件中的名字通常只有在文件中可以看到,该语句使得其后的名字可以在文件外可见,_start是连接器可以识别执行的第一条指令。
END ; //表示程序的结束,其后不能跟任何语句
三、第一行helloworld!
看到上面都是代码是不是很无趣呀,让我们写下第一行helloworld吧,在记事本里面写下代码,另存为hello.asm文件。
; output hello,world
; Author: threecat.up
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
INCLUDE io.h ; header file for input/output
cr EQU 0dh ; carriage return character
Lf EQU 0ah ; line feed
.STACK 4096 ; reserve 4096-byte stack
.DATA ; reserve storage for data
str1 byte 'hello,world!' ,0//定义字符串变量
str2 byte ' 1024,happy!' ,0
.CODE ; start of main program code
_start:
output str1//打印hello,world等字符串
output str2
INVOKE ExitProcess, 0 ; exit with return code 0
PUBLIC _start ; make entry point public
END ; end of source code
我们在记事本(后缀名为.asm大小写均可)里面写下这行代码,然后当然是汇编链接运行啦。
首先汇编执行(进入你保存hello.asm文件的路径):
ml /c /coff hello.asm
然后链接:
link /subsystem:console /entry:start /out:hello.exe hello.obj io.obj kernel32.lib
在DOS里面有:
看,打印出第一行代码啦!
后记:
之后也会陆续更新关于汇编语言的知识,欢迎关注哦,溜了溜了,1024coding~