程序集 x86 无限循环问题 MOV CX,过程 RET 后 12


NUM EQU 3
.MODEL small
.STACK
.DATA
tempi DW 8,27,17,12,21,34,9,41,7,18,15,5
risultato DW NUM DUP (?)
.CODE
.STARTUP
PUSH OFFSET tempi
PUSH OFFSET risultato
CALL copiaVettore
ADD SP,4
MOV CX, 0
MOV CX,12
LEA BX, risultato
salta:
MOV DX, [BX]
ADD DX, 30h
ADD BX, 2 
MOV AH, 2h
INT 21h
LOOP salta
.EXIT
copiaVettore PROC
PUSH BP 
MOV BP, SP
PUSH DI
PUSH SI
MOV DI, [BP+4] ;risultato
MOV SI, [BP+6] ;sorgente    
MOV CX, 12
ciclo1: 
MOV AX, [SI]
MOV [DI], AX 
ADD DI, 2
ADD SI, 2
LOOP ciclo1
POP SI
POP DI
POP BP
RET
copiaVettore ENDP 
END

当过程RET骨灰盒时,调试器在MOV CX, 12

跳过未知操作码:00 不是 8086 指令 - 尚不支持。

但是程序内部的MOV CX, 12效果很好。

破坏的好例子。大多数人都删除了注册,你"破坏"了你的代码而不是:)

NUM EQU 3          ; <-- here's the problem
.MODEL small
.STACK
.DATA
tempi DW 8,27,17,12,21,34,9,41,7,18,15,5  ;  12 words source
risultato DW NUM DUP (?)                  ;  but only 3 words data

由于您只有 3 个单词用于复制,因此以下 9 个单词将写入代码,从而破坏 RET 返回的代码

.CODE
.STARTUP
PUSH OFFSET tempi       ; 3 bytes 12,0,21
PUSH OFFSET risultato   ; 3 bytes 0,34,0
CALL copiaVettore       ; 3 bytes 9,0,14
ADD SP,4                ; <-- this is where the RET will return, 
MOV CX, 0               ;     but starting from here the code 
MOV CX,12               ;     is overwritten with 0,7,0,18 ...
LEA BX, risultato

所以你期望的代码不再存在了。

最新更新