Not Hello World
通常对于一门语言的学习,一般都是以“Hello,World!”开始的。但对于汇编语言的学习,输出这句话并不容易,首先得了解寄存器等硬件知识。
汇编语言要得以运行,首先要讲源文件编译链接成可执行文件,才能运行。这里需要编译器和连接器(资源我分享到了百度云:链接:https://pan.baidu.com/s/1dE4mb3F,密码:ywfp)。因为我用的是32位Win7,因此我可以不用DosBox。
一、第一个源文件
代码如下
assume cs:codeseg
codeseg segment
mov ax,2
add ax,ax
add ax,ax mov ax,4c00H
int 21H
codeseg ends
end
从这个汇编语言程序是用来计算23的。
首先看到assume(伪)指令,英文意思是“假设”之意,后面紧跟cs:codeseg,这里其实是定义了一个代码段名,对于一个程序必须得有一个段而且是代码段,对于数据段和栈段可以不必有,若缺少代码段,数据段和栈又怎能构成一个程序呢。codeseg称为标号,指代一个地址,这个段的名称最终会被编译链接称为一个地址。对于codeseg
segment……codeseg
ends这一对伪指令定义了一个段,segment表示段开始,ends表示段结束。end伪指令意味着程序的真正结束,每个程序必须有,否则将无法知道程序什么时候结束。
段内部分是真正的汇编指令,最后面两句mov ax,4c00H和int 21H是程序返回,这是固定的。DOS系统是一个单任务操作系统,对于两个程序P1,P2(假设P1正在执行),如果要执行P2,必须由P1将P2加载到内存,将CPU授权给P2,P2才可执行,此时P1将挂起。当P2结束后,应将CPU还给P1,让P1继续执行,若只有一条指令,则交给系统,int指令不是c或其他语言中的整形类型,而是中断指令。因此这两句必不可少。
二、程序编辑、编译、连接&运行
(1)编辑
对于编辑器有很多,什么notepad,notepad++,UltraEdit什么的都可以,喜欢用哪个就用哪个。保存为“文件名.asm”的形式。
(2)编译
新建立一个文件夹,我的在F:\masm中,将masm6.15中的debug.exe,masm.exe,link.exe和ml.exe拷贝进去就行。在DosBox下masm6.15自己的不知道为什么不能用,只能用masm5,。当然将源程序也放进去。
编译:使用masm 文件名.asm
编译成功,将会生成一个obj文件,用ue打开之后是一些16进制数,不懂。
(3)连接
连接:使用link 文件名.obj即可,连接后将生成exe文件。
编译时Run File什么的直接回车略过就行,因为这个文件没用什么库啥的,暂且不用管。
连接的作用主要是:
- 当源程序较大时,将源程序分为多个文件来编译,编译完成后再将其一一连接,便于源程序管理。
- 需要用到其他的库文件时
- 对于生成的obj文件还不能直接执行,需连接程序将其处理为可直接运行的文件
(4)运行
直接输入exe文件名运行就可以了,但通常是一闪而过,因为机器足够快。
随机推荐
- 在DevExpress程序中使用内置的图标构建美观的界面元素
在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...
- asp.net读取模版并写入文本文件
本文要介绍的是ASP.NET怎样读写文本文件,但更重要的是实现的过程.使用的工具是Visual Studio 2015 ,.NET版本是4.6.1 .一共建立的2个项目,HoverTreePanel和 ...
- STL的std::find和std::find_if
std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...
- Java设计模式——线程安全的单件模式
单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...
- 深入理解js的变量提升和函数提升
一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段
在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...
- AgilePoint实例属性修改
流程实例中的参数存放在WF_CUSTOM_ATTRS表的WF_CUSTOM_ATTRS字段,为ntext类型,里面存放的是XML,不能直接修改 update [APData].[dbo].[WF_ ...
- Android关于listView的BaseAdapter以及getView的三级优化
1.4个重写方法的含义 自定义Adapter继承自BaseAdapter(通用适配器) getCount(); getItem(); getItemId(); getViewTypaCount() ...
- 7个高性能JavaScript代码高亮插件
本文由码农网 – 小峰原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 对于喜欢写技术博客的同学来说,一定对代码高亮组件非常熟悉.一款优秀的JavaScript代码高亮插件,将会帮助你渲染 ...
- css之浮动
标准文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流.每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 标准流的微 ...