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文件名运行就可以了,但通常是一闪而过,因为机器足够快。
随机推荐
- asp.net core 1.1 升级后,操作mysql出错的解决办法。
遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...
- TabControl 伸缩式菜单 仿照 uwp SplitView
留下备用笔记 之前用的Frame+Page的切换content<类似于一个contentControl 干多个事情>,但是发现页面content内容控件多的时候,每一次切换都有点卡,点击了 ...
- Entity Framework 数据库初始化的三种方法
在数据库初始化产生时进行控制,有三个方法可以控制数据库初始化时的行为.分别为CreateDatabaseIfNotExists.DropCreateDatabaseIfModelChanges.Dro ...
- enote笔记法使用范例(1)——自己总结的一些编写代码的常识 (a)
章节. 编程习惯 why 函数(<<为了>>便于提升软件开发效率和维护效率) 开发角度: 1)隐藏实现细节,这也是API质量最重要的品质2)复用:通过使用函数来代码复用 ...
- spring源码:IOC(li)
一.BeanDefinition BeanDefinition是配置文件<bean>元素标签在容器中内部表示形式.创建最终的BeanDefinition主要包括两个步骤: 1)利用Bean ...
- 如何:加载分页结果(WCF 数据服务)
WCF 数据服务 允许数据服务限制单个响应源中返回的实体数.在此情况下,源中的最后一项包含指向下一页数据的链接.通过调用执行 DataServiceQuery 时返回的 QueryOperationR ...
- elasticsearch高级配置二----线程池设置
一个Elasticsearch节点会有多个线程池,但重要的是下面四个: 索引(index):主要是索引数据和删除数据操作(默认是cached类型) 搜索(search):主要是获取,统计和搜索操作(默 ...
- 天猫魔盒远程安装APP
从前的小米盒子299给了父母用,前段时间天猫搞活动,99撸了一个天猫魔盒,天猫亲爹阿里真是有钱任性.由于广电总局各种规定,当然也有盒子厂商的利益,默认很多片是需要付费观看的,而且也看不了电视直播.所以 ...
- CentOS7下安装Python的pip
root用户使用yum install -y python-pip 时会报如下错误: No package python-pip available Error:Nothing to do 解决方法如 ...
- 缓冲区溢出利用——捕获eip的傻瓜式指南
[译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...