【问题标题】:Assembly x86 infinite loop issue MOV CX, 12 after Procedure RET汇编 x86 无限循环问题 MOV CX, 12 后程序 RET
【发布时间】:2018-07-01 23:18:35
【问题描述】:
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

当过程RETurns 时,调试器在MOV CX, 12 上停止,并带有

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

但过程中的MOV CX, 12 运行良好。

【问题讨论】:

  • 为什么是你的NUM EQU 3?您处理了 12 个单词,但 risultato 中只有 3 个单词的空间可能会覆盖您的代码。
  • 为什么你的标题说“无限循环”?您描述的问题完全不同:循环退出,但内存已损坏。当您破坏循环内的循环计数器寄存器时,通常会发生无限循环。

标签: assembly x86-16 emu8086


【解决方案1】:

破坏的好例子。大多数人破坏注册,你“破坏”你的代码而不是:)

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多