通过一个基本框架解释各个指令和用处,方便复习。所以我认为最好的学习顺序就是先看一段完整的汇编代码程序,然后给你逐个逐个的解释每一个代码是干嘛用的。然后剩下的还有很多指令或者伪指令会在以后用到的时候再根据具体上下文使用,我认为汇编就是实战出来的,很多指令根本不用记忆,需求出来了,你用了后就知道是怎个事了。
First Program
经典Hello Word!
代码如下:
stack segment
db 10 dup(00)
topSP equ this word ;栈顶指针地址标号
stack ends
datas segment
string db 'Hello Word!', 0Dh, 0AH, '$'
db 10 dup (?)
datas ends
code segment
assume cs:code,ss:stack,ds:datas
start:
mov ax, datas
mov ds, ax
mov dx, offset string
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
code ends
end start
编译->链接->运行,经过三个步骤就能够使用debug对生成的exe文件调试了
编译命令:masm 名.asm;
链接命令:link 名.obj; (obj文件是在masm后自动生成的)
运行命令:名.exe(exe文件是在link后自动生成的)
debug调试exe命令:debug 名.exe

指令系统
伪指令
伪指令都不占程序空间,因为在编译过程中,你的伪指令全部帮你翻译好了,然后变成机器指令后就只能按照机器指令, 机器指令没有伪指令,伪指令是方便人类阅读代码的,可以通过汇编编译器翻译对应的计算机能够执行的机器指令,比如:fun我把他作为一个函数入口地址,我们编译器翻译的时候不会再fun这一处存fun的地址空间,而是假设你有用到fun这个函数入口地址的话,在你使用该标号的位置处将该标号翻译成fun的入口地址就是fun的下一条指令。
-
标号(他不是伪指令,是一个不占空间但又不是伪指令的东西)
可以理解为变量名,变量的名字可以随便起,这个和下面介绍的名字指令差不多。
标号后一定要接了一个冒号:,表示这个标号可以作为一个地址,地址和下一个指令地址一样。(虽然不是伪指令,但是他也不占程序空间,用来标记程序中某些位置的)随便名标号: mov ax ,bx loop 随便名标号 ... -
名字(就是程序中Stack 或者 datas这些,可以随便命名)
可以理解为变量名,用来记录当前位置的下一条指令或者数据的地址,所以利用这个特点我们就可以用它来定位是一件十分轻松的事情,因为他不占空间地址,写一条指令上去后就可以直接用这个指令的名字来表示地址了,很方便。(这里我程序里面也用到了我给栈顶指针起了个名字topSP ,最显著的特点就是用来当栈顶指针,妈妈再也不用担心我计算指针位置错误了!又因为他不占空间,有了这个标志就直接用就可以找到栈顶指针,不会影响后面的代码位置关系)随便名字段 segment 随便名字段 ends 随便名字段 db 'hello' ... -
ASSUME
翻译就是:假设、设想
在汇编中是指明段寄存器的段名,格式为:assume 段寄存器:随便名字段
随便名字段是段地址,是段地址,是段地址!!
assume可以放在开头也行,不一样放在数据段定义的后面,因为assume是伪指令,汇编编译过程中会帮你翻译好。
很明显这个是给自己编写的段一个归属,比如我datas段就是专门给ds段的,所以在assume中就是ds:datas,这就将我们的datas段数据连接到了数据段了,说到连接,那其实assume的本质就是为了汇编在link的时候将自己写的段设置到正确的段位置。
注意事项:assume是 给自己定义的数据块指明回家的路,回到自己的段内,意思是DS冒号后面你的数据段属于DS段,那你要是用你他的时候就需要在DS里面访问(这里是一个坑,下面我接着说很重要的一点)
还有一点很重要:我们assume定义完成后希望在code代码里面使用这段数据的话,其实代码里面还需要自己将DS段设置为随便名字段对应的段地址,我们的随便名字段就是段地址。
因此正确使用我们定义的数据段因该是:assume cs:随便名字段,ds:datas, ss:随便名字段3 mov ax, datas mov ds, ax将datas段地址给到我们的ds段,由于前面设置了ds:datas,所以编译器看得懂你这段datas数据,否则定义在其他段了你又在ds使用的话就会出问题。datas可以随便起名字
-
OFFSET 标号或者名字 / SEG 标号或者名字
offset是返回标号在他自己的段的偏移地址
seg是返回标号所在的段地址
一般用法:mov ax, offset string mov ax

本文介绍了汇编语言的基础概念,包括FirstProgram示例中的指令系统、伪指令的使用,以及如何通过编译、链接和debug工具进行程序调试。重点讲解了int21中断的功能及其在HelloWorld程序中的应用。
最低0.47元/天 解锁文章
2379

被折叠的 条评论
为什么被折叠?



