knife911 发表于 2024-1-23 08:43

loop指令+cx寄存器

本帖最后由 knife911 于 2024-1-23 11:02 编辑

;示例代码
      assume cs:code
      code segment
                mov ax,0002H                  ;ax寄存器赋值2
                mov cx,000BH                  ;cx寄存器赋值11
                s:    add ax,ax                     ;ax=ax+2
                loop s                              ;执行标号为s处的代码
                mov ax,1000H
                int 21H
      code ends
      end




执行过程:
1、CX = CX - 1
2、判断此时CX是否为 0
3、如果CX不为 0,则转到标号处执行(jmp 标号)
4、如果CX为 0,则继续向下执行




debug -t单步执行
可以看到程序从段寄存器:偏移地址CS:IP=0E24:0000处开始执行。
寄存器AX中内容在累加
CX寄存器中的值在每次循环后减1直至为0,跳出循环
执行dos中断指令。


1cx初始值=11(000BH)
(cx)=(cx)-1
   ax=0002H      ax初始值0002H
   add ax,ax      (ax)=0004H
   (cx)=000BH
   10=11-1                第1次执行s
    9=10-1                第2次执行s
    .
    .
    .
    0=1-1                第11次执行s
判断cx的值是否为0
若不为零,则跳转至标号s处
ax寄存器中的值:AX=1000h=   2,4,8,16,32,64,128,256,512,1024,2048,4096=2的12次方

实际上:
(ax)=0004H      执行了2的12次方
若为零,则继续执行下条指令
mov ax,1000h


说明:
1、标号s,实质上是偏移地址
2、CX寄存器中的值就相当于循环的次数

冥界3大法王 发表于 2024-1-23 10:32

@knife911 啥环境下,用的哪款汇编测试平台呢? {:301_986:}

knife911 发表于 2024-1-23 10:34

本帖最后由 knife911 于 2024-1-23 10:36 编辑

冥界3大法王 发表于 2024-1-23 10:32
@knife911 啥环境下,用的哪款汇编测试平台呢?
vscode+masm/tasm插件,,,,dosbox模拟器,

FelixLee 发表于 2024-1-23 11:15

汇编基础知识
页: [1]
查看完整版本: loop指令+cx寄存器