汇编语言实践

一、第一个程序

1.一个源程序从写出到执行的过程

汇编语言由三部分组成:

  • 汇编指令(机器码的助记符)*核心
  • 伪指令(由编译器执行)
  • 其他符号(由编译器识别)

对源程序进行编译连接

  • 使用MASM.EXE对源程序文件中的源程序进行编译,产生目标文件
  • 再用LINK.EXE对目标文件进行连接,生成可在操作系统中直接运行的可执行文件

可执行文件包括两部分内容

  • 程序(从原程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
  • 相关的描述信息(比如:程序有多大,要占多少内存空间等等)
assume cs:codesg

;assume:含义为“假设”,它假设某一段寄存器和程序中的某一段用segment...ends定义的段相关联
;assume(假设) cs(代码段):codesg(命名)

codesg segment

;segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令
;segment和ends的功能是定义一个段,segment表示一个段的开始,ends表示一个段的结束
;一个段必须有一个名称来标识,使用格式为:段名 segment/ends

start:    mov ax,0123H
          mov bx,0456H
          add ax,bx
          add ax,ax

          mov ax,4c00H
          int 21H

;由start开始到int结束的是汇编指令(有对应的机器码的指令,可以被编译为机器指令,最终为CPU执行)
;其余都是伪指令,不被CPU执行,没有对应机器码,由编译器执行     
codesg ends

end start

;End是一个汇编程序的结束标记,编译器在编译汇编程序的过程中,如果碰到了伪指令end,就结束对源程序的编译。


;一个汇编程序是由多个段组成,这些段被用来存放代码、数据或当作栈空间使用
;一个有意义的汇编程序必须至少有一个段,这个段用来存放代码

2.源程序

标号

一个标号指代了一个地址

codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。

程序的结构

任务:编程运算2^3

  • 定义一个段
  • 实现处理任务
  • 程序结束
  • 段与段寄存器关联
assume cs:abc;4
abc segment;1

mov ax,2;2
add ax,ax;2
add ax,ax;2

abc ends;1
end;3

DOS中的程序运行

DOS是一个单任务操作系统

s一个程序B在可执行文件中,则必须有一个正在运行的程序A(DOS),将B从可执行文件中加载入内存后,将CPU的控制权交给B后,B才得以运行。B运行后,A暂停运行。

而当B运行完毕后,应该将CPU的控制权交还给使他得以运行的程序A,此后,A继续运行。

程序返回

  • 我们的程序最先以汇编指令的形式存在源程序中,经过编译、连接转变为机器码,存储在可执行文件中。
  • 现在我们知道,一个程序结束后,将CPU的控制权交还给使他得以运行的程序,我们称这个过程为:程序返回
  • 应该在程序的末尾段加返回的程序段:mov ax,4c00H                                                                                                                             int 21H      (中断机制)                                                这两条指令所实现的功能就是程序返回

上机操作:

环境搭配请参考汇编语言学习篇2——MASM的环境搭建(win10与Ubuntu1604下的配置)【有问题,待更正】-CSDN博客1.exe的执行

我们的程序没有像显示器输出任何信息,程序只是做了一些将数据送入寄存器和加法操作,而这些事情,我们不可能从显示屏上看出来。                                                              

编译连和接的作用:

  • 当程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将他们连接到一起生成一个可执行文件。
  • 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件。       
  • 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。
  • 所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理

3.程序执行过程的跟踪

assume cs:codesg

codesg segment

start: mov ax,0123H
	   mov bx,0456H
	   add ax,bx
	   add ax,ax
	   
	   mov ax,4c00H
	   int 21H
	   
codesg ends

end start

以上述程序text2.exe为例

可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度,text2.exe中程序的机器码共有15字节

  • 用R命令查看当前
  • 用U命令查看一下其他指令
  • 用T命令执行程序中的每一条指令,并观察每条指令的执行结果。
  • 到了int21,我们要用P命令来结束
  • int21执行结束后,显示“Program terminated normally”表示程序正常结束返回Debug

需要注意的是,在DOS中运行程序时,是commend将程序加载入内存;所以程序运行结束后返回到commend中,而在这里是Debug将程序加载入内存,所以程序运行结束后要返回到Debug中。

使用Q命令推出Debug,将返回到commend中,因为Debug是由commend加载运行的。

二、[BX]和loop指令

2.1 [bx]

(好吧我其实挺讨厌汇编的,先去学学Python和java吧还是QAQ)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值