循环不继续,程序很快退出

问题描述 投票:0回答:1

D 数组应包含位于 S 中偶数位置的元素,然后是位于奇数位置的元素。最后 D 数组应该看起来像 1,3,5,2,4,但下面的代码只让它变成 1,3,5,0,0。我验证了,指令

mov si, 1
执行一次,然后程序退出。

assume ds:data,cs:code

data segment
  S db 1,2,3,4,5
  len equ $-S 
  D db len dup(0) 
data ends

code segment
start:
  mov ax, data
  mov ds, ax
  mov si, 0 
  mov di, 0 
  mov cx, len 
repeat:
  mov al, S[si] 
  mov D[di], al
  inc di
  add si, 2 
  cmp si, len
  JGE instruction 
  dec cx
  CMP cx, 0
  JNE repeat
  JE sf
instruction:
  mov si, 1
sf:
  mov ax, 4C00h
  int 21h
code ends
end start

loops assembly x86-16 exit early-stopping
1个回答
0
投票

我再次查看了代码,发现有些部分可以更改或删除。

  1. 循环计数器位于

    cx
    。我不知道这是否是一个好的做法,但是 我只使用
    si
    来表示
    repeat1
    conditional jumps
    。所以我删除了所有连接到
    cx
    的代码。

  2. 我将指令

    JE sf
    移到了
    cmp si, len
    之后,因为在奇数的情况下,
    si (index of S)
    始终是偶数。 程序将
    1
    3
    5
    复制到
    array D
    ,并且此条件跳转对于索引
    si = 0, 2 and 4
    不成立。

  3. 在第三次迭代中

    array D
    看起来像这样
    D = 1 3 5
    di = 3
    si = 6
    jg instruction
    被执行。 您的代码更改了
    si
    si = 1
    ,因此您想做正确的事情,更改
    index of S array
    并复制其余数字。 我添加了
    jmp repeat1
    si
    di
    是正确的,因此程序复制了数组 S 的其余部分。

  4. 迭代 4:

    D[3] = S[1] = 2
    di = 4
    si = 3

    迭代 5:

    D[4] = S[3] = 4
    di = 5
    si = 5

    这里

    si = 5
    所以程序复制了所有值并跳转到退出标签
    sf


assume ds:data,cs:code

data segment
  S db 1,2,3,4,5
  len equ $-S 
  D db len dup(0) 
data ends

code segment
start:
  mov ax, data
  mov ds, ax
  mov si, 0 
  mov di, 0 
;  mov cx, len
  
repeat1:
  mov al, S[si] 
  mov D[di], al
  inc di
  add si, 2 
  cmp si, len
  JE sf
  JG instruction 
  jmp repeat1

  ;dec cx
  ;CMP cx, 0
  ;JNE repeat1
  
instruction:
  mov si, 1
;  mov cx,2
  jmp repeat1
sf:
  mov ax, 4C00h
  int 21h
code ends
end start
© www.soinside.com 2019 - 2024. All rights reserved.