汇编语言基础知识

程序语言分类

机器语言:二进制指令

汇编语言:在机器语言的基础上加入助记符等

高级语言

应用领域

  • 加密解密
  • 逆向分析
  • 病毒分析与防治
  • 网络安全领域
  • 驱动程序的开发

基础构成(以hello world为例)

.model tiny;指定程序规模tiny\small\compact等
.code;创建代码段
.startup;指定程序开始执行起始点
mov dx,offset string;将string字符串首地址送入dx寄存器中,offset的功能就是得到标号到数据段起始地址的距离
mov ah,9;调用9号显示字符串功能
int 21h;调用中断服务程序
.exit 0;程序结束指令
string db 'Hello,World!',0dh,0ah,'$';定义字符串,0dh、0ah分别是回车(行结束)、换行的ASCII码值
end;汇编语言程序结束标志

####A little question

为什么字符串定义中既然有换行了,还要输入回车?

我综合了一下网上的解释:

0dh代表的回车:回到行首\标志该行的结束(有争议)

0ah代表的换行:进入下一行

那么回车的作用到底是什么呢?不如一起去实验一下

在asm文件中,我删除了字符串定义末尾的0dh,即删掉了回车功能,如下图所示:

.model tiny 
.code
.startup
mov dx,offset string
mov ah,9
int 21h
.exit 0
string db 'Name:yuanmengyao',0ah
db 'Number:201886013',0dh,0ah
db 'Emai:971180567',0dh,0ah,'$'
end

运行之后的输出结果如下:

汇编语言程序设计笔记——基础知识(hello world)_机器语言

!!!竟然没有变化

我推测是换行符0ah发挥了作用,因此我删除了换行符,只保留回车符

.model tiny 
.code
.startup
mov dx,offset string
mov ah,9
int 21h
.exit 0
string db 'Name:yuanmengyao',0dh
db 'Number:201886013',0dh,0ah
db 'Emai:971180567',0dh,0ah,'$'
end

输出结果如下

汇编语言程序设计笔记——基础知识(hello world)_换行符_02

可见,第一行的name被覆盖了,因此我更倾向于0dh的作用是将光标移至行首

生成可执行文件

  1. 编译汇编源文件:Masm.exe Hello.asm
  2. 链接生成可执行文件:Link.exe Hello.obj/tiny
  3. 运行可执行文件,检查结果:Hello.com

需要注意的是,在使用DOSBOX的时候,路径中应包含所需的masm.exe等所有exe文件,否则无法运行。即下示doswork路径中,应包含所有的exe文件。

mount c: e:\doswork\
c:

作业

汇编语言程序设计笔记——基础知识(hello world)_汇编语言_03

.model tiny 
.code
.startup
mov dx,offset string
mov ah,9
int 21h
.exit 0
string db 'Name:yuanmengyao',0dh,0ah
db 'Number:201886013',0dh,0ah
db 'Phone:13079893635',0dh,0ah
db 'Email:971180567@dlut.edu.cn',0dh,0ah,'$'
end