assembly 循环无法继续,程序过早退出

dkqlctbz  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(48)

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

字符串

rhfm7lfc

rhfm7lfc1#

我再次查看了代码,注意到有些部分可以更改或删除。
1.循环计数器在cx中。我不知道这是否是好的做法,但我只对repeat1conditional jumps使用了si。所以我删除了所有连接到cx的代码。
1.我将指令JE sf移到cmp si, len之后,因为在奇数的情况下,si (index of S)总是偶数。程序将135复制到array D,并且对于索引si = 0, 2 and 4,此条件跳转不为真。
1.在第三次迭代中,array D看起来像这样D = 1 3 5di = 3si = 6。代码通过条件跳转到instruction标签。您的代码更改了sisi = 1,所以您想做正确的事情,更改index of S array并复制其余的数字。我添加了jmp repeat1sidi是正确的,所以程序复制数组S的其余部分。
1.迭代4:
D[3] = S[1] = 2di = 4si = 3
迭代5:
D[4] = S[3] = 4di = 5si = 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 
  
repeat1:
  mov al, S[si] 
  mov D[di], al
  inc di
  add si, 2 
  cmp si, len
  jb repeat1
  je sf  

instruction:
  mov si, 1
  jmp repeat1

sf:
  mov ax, 4C00h
  int 21h
code ends
end start

字符串

相关问题