汇编语言学习分享(四)

[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用于声明一个段结束,使用格式为:oop

段名 segnment
段名 ends

好比用codesg为段名声明一个用于存放数据的段:code

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中了。

相关文章
相关标签/搜索