汇编语言学习分享(四)
[BX]的含义
想要完整的描述一个内存单元,需要两个条件:1.内存单元的地址 2.内存单元的长度(类型)。
首先讲一下[0]的含义,[0]表示的内存单元,偏移地址为一个立即数0,段地址默认保存在DS寄存器中(之前的文章中讲到过,通过DS寄存器和偏移地址(ds:[0])就可以确定内存中的一个地址)。
说完[0]再回头来说[bx],[bx]表示的依然是偏移地址,但是它不是一个立即数了,而是保存在一个寄存器中,段地址还是默认保存在DS寄存器中。
loop指令
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两部操作,第一步:cx = cx - 1 第二步:判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。从这两步我们可以看出loop指令的执行结果受到cx中值的影响,通常情况下,我们使用loop指令来实现循环功能,cx中存放loop指令需要循环的次数。
伪指令
在汇编语言中,包含两种指令,一种是汇编指令,另一种是伪指令,汇编指令是对应着机器码,可以直接被编译为机器指令被CPU执行,而伪指令不会被CPU执行,它是用来让编译器进行相关的编译工作。
(1)segment
segnment和ends是一对成对使用的伪指令,用于定义一个段,segnment用于声明一个段开始,ends用于声明一个段结束,使用格式为:
段名 segnment 段名 ends
比如用codesg为段名声明一个用于存放数据的段:
codesg segnment codesg ends
一个汇编程序由多个段形成,这些段用来存放代码、数据或者当作栈空间使用,一个有意义的汇编程序至少要有一个段用于存放代码。
(2)end
end指令是一个汇编程序的结束标记,编译器在执行汇编程序的时候如果碰到end就结束对源程序的编译。
(3)assume
assume是假设的意思,它用于假设某一个寄存器和程序中的某一段相关。比如:
assume cs:codesg
就是将代码段codesg和CPU的段寄存器cs联系在一起。
再来讲讲标号,除了汇编指令和伪指令以外,还有标号,一个标号指代一个地址。比如codesg segment,这个codesg最终将被处理为一个段的段地址。
程序分析
接着来分析一段求2的10次方汇编程序
assume cs:code code segment mov ax,2 mov cx,9 s: add ax,ax loop s mov ax,4c00h int 21h code ends end
分析:
先来看一下整体框架
- assume cs:code表示cs与code代码段有联系
- code segment和code ends用于标识一段代码段
- end用于表示程序结束
接着分析中间部分
- mov ax,2 将2存到ax寄存器中用作初始值
- 将9存放到cx中用于循环次数计数
- s是标号,指代add ax,ax的地址
- add ax,ax就是将ax中的值进行自加
- loop s就是执行到这一句的时候就就跳转到标号为s的地方,也就是add ax,ax的地址,loop每执行一次cx就减一,只到cx为0就执行结束,loop指令就不再跳转而是接着向下执行
最后的 mov ax,4c00h和 int 21h暂时先不管
这样就将2的10次方的值保存在ax中了。