曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 5.2 loop

Loop 指令

loop 指令的格式是:loop 标号, CPU执行loop指令的时候,要进行两步操作:

  1. $(CX) = (CX) - 1$
  2. 判断CX的值,不为零则转至标号处执行程序,如果为零则继续向下执行

CX的值影响着loop指令的执行结果。通常,我们用loop指令来实现循环功能,CX中存放着循环的次数

我们编写一个实现$2^12$的代码,代码如下:

assume cs:code
code segment
start: mov ax, 2

       mov cx, 11
    s: add ax, ax
       loop s

       mov ax, 4c00H ; 注意这里必须写H,因为编译里默认10进制而非16进制
       int 21H

code ends
end start

这里有三个注意事项:

  1. 标号,代表一个地址,可以替换为其他名称。这个地址里标识了一个地址,这个地址有一条指令:add ax, ax
  2. loop s, 执行时要执行两步操作:1. $(CX) = (CX) - 1$ 2. 判断CX中的值,不为零跳转到标号s所标识的地址处执行,如果为零则跳转到后面代码
  3. 执行下面指令:
     mov cx, 11
    s:  add ax, ax
     loop s
    

    执行loop s时,首先将(CX)减一,然后若(CX)不为0,则向前转至s处执行add ax, ax。可以利用(CX)来控制循环数。

下面我们进行编译并尝试debug跟踪:

figure1

这里CX = 000F初始标识的这个程序的大小为15个字节。

随后,我们开始执行循环命令,如下图

figure2

这里观察代码段的偏移地址,代码会反复循环在IP=0006, 这是循环开始的标号。

直到循环结束计算出$AX=2^{12}=1000H$(十六进制)。

figure3

Last One

汇编语言 5.3 Debug跟踪loop循环

5.3 在Debug中跟踪用loop指令实现的循环程序首先要考虑一下超出地址存储能力的问题:加入我们要计算在FFFF:0006单元中的数乘以3,并将结果存储在DX中。 我们每次做这种类似的计算时,要注意是否会超出DX的存储范围!ffff:0006单元中的数是字节型数据,所以范围在0~255之间,这是因为对于字节型数据,计算方式如下:\[2^8=256\]所以范围在0~255之间,相对的对于DX通用寄存器,由于数据存储针对的往往是字型数据,而针对于16位的字型数据,计算方式如下:\[2^{...…

汇编语言More
Next One

Markdown 语言高亮关键字(转载)

转载自CSDN, 原作者yxys01. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Diff diff HTTP ...…

blogMore