导言:
本次篇主要用两种方法实现汇编编程与运行,分别为masm 2015和masm5.0。
一、Masm 2015
;完整段的Hello World程序
DATAS SEGMENT
STRING DB 'Hello World!',13,10,'$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
- 伪指令db定义一个字符串,名字是STRING,字符串是“Hello World!”,13是回车符,10是换行符,$是汇编下字符串的结束标志。
- segment…ends
定义一个段,例子中定义了一个数据段DATAS和一个代码段CODES - end 表示编译结束,ends表示段结束
- mov ah,9
int 21h
是固定表示,返回程序 - assume这条伪指令的含义为“假设”,假设某一段寄存器和程序中的一个段的相关联。
- start为程序入口
执行结果:
解释:
1.为什么要返回程序
在DOS(一个单任务操作系统)的基础上,一定有一个一直再运行的程序P1,P1把P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2运行结束后必须将CPU的控制权返回给P1。
二、masm5.0
64位计算机中自带的cmd无法运行汇编,需要使用DOS进行编译、连接、加载、运行。
- DOSBox在使用的时候需要先配置环境,使用类似示例 “mount C F:\masm5.0” 的命令来将我们本地的一个目录挂载为 DOSBox 的一个驱动器之后,才能够正常使用 DOSBox。
1、先编程放在文件放在masm5.0文件中\或者直接用edit编程
;1.asm
assume cs:codesg ;将用作代码段的段codesg和段寄存器cs联系起来。
codesg segment ;定义一个段,段的名称为“codesg”,这个段从此开始
;codesg是一个标号,作为一个段的名称,最终被编译连接成一个段的段地址
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H ;这两条指令实现程序的返回
codesg ends ;名称为“codesg”的段到此结束
end ;编译器在编译汇编程序的过程中,碰到了伪指令end,结束对源程序的编译
2.编译、连接、加载运行
三、使用debug对程序执行过程跟踪
-R 查看修改CPU寄存器内容
-D 查看内存中内容
-E 改写内存中内容
-U 将内存中的机器语言翻译成汇编指令
-T 执行一条汇编指令
-A 以汇编指令的格式在内存中写入一条机器指令