2013-07-08 74 views
0

我試圖建立在裝配8086對電腦的井字遊戲,但每當我運行的TD卡在這個特定的命令:裝配8086 - TD卡住

MOV DX, 0

這個命令是在一個功能(第三行):

reboard proc 
     mov al, 0 
     mov bx, 0 
     mov dx, 0 
     mov cx, bp 
     rowdata: 
      cmp arr[bx], 'X' 
      je rowX 
      cmp arr[bx], 'y' 
      je rowY 
      jmp rowQm 
      rowX: 
       add al, 100 
       jmp rowQm 
      rowY: 
       add al, 1 
      rowQm: 
       inc bx 
     loop rowdata 

     mov cx, bp 
     add si, dx 
     mov arr[si + 3], al 
     sub si, dx 
     mov al, 0 
     inc dx 
     cmp dx, bp 
     jnz rowdata 

     mov dx, 0 
     mov bx, dx 
     coldata: 
      cmp arr[bx], 'X' 
      je colX 
      cmp arr[bx], 'Y' 
      je colY 
      jmp colQm 
      colX: 
       add al, 100 
       jmp colQm 
      colY: 
       add al, 1 
      colQm: 
       add bx, bp 
       loop coldata 
     add si, bp 
     add si, dx 
     mov arr[si + 3], al 
     sub si , dx 
     sub si, bp 
     inc dx 
     mov bx, dx 
     mov al, 0 
     mov cx, bp 
     dec cx 
     cmp dx, bp 
     jnz coldata 
     ret 
    reboard endp 

另外,在該函數的兩個第一命令被施加,但不這樣做在寄存器的任何變化。

這不是我第一次遇到這個問題,它也發生在另一個函數中(在同一個程序中),同樣 - 函數中的前兩個命令不起作用。命令是:

MOV DL,13

我試圖將光標向下移動一行。

我還跑了一個新的程序特定的功能,它完美地工作從開始到結束,我無能,反正這是新的程序我想:

注:「X」的值是88 ,'Y'的值是89.

dseg segment 
    arr db 63, 63, 89, 88, 89, 63, 63, 88, 89 
dseg ends 
cseg segment 
assume cs:cseg, ds:dseg 
a proc 
    mov al, 0 
    mov bx, 0 
    mov dx, 0 
    mov cx, bp 
    rowdata: 
     cmp arr[bx], 'X' 
     je rowX 
     cmp arr[bx], 'Y' 
     je rowY 
     jmp rowQm 
     rowX: 
      add al, 100 
      jmp rowQm 
     rowY: 
      add al, 1 
     rowQm: 
      inc bx 
    loop rowdata 

    mov cx, bp 
    add si, dx 
    mov arr[si + 3], al 
    sub si, dx 
    mov al, 0 
    inc dx 
    cmp dx, bp 
    jnz rowdata 

    mov dx, 0 
    mov bx, dx 
    coldata: 
     cmp arr[bx], 'X' 
     je colX 
     cmp arr[bx], 'Y' 
     je colY 
     jmp colQm 
     colX: 
      add al, 100 
      jmp colQm 
     colY: 
      add al, 1 
     colQm: 
      add bx, bp 
      loop coldata 
    add si, bp 
    add si, dx 
    mov arr[si + 3], al 
    sub si , dx 
    sub si, bp 
    inc dx 
    mov bx, dx 
    mov al, 0 
    mov cx, bp 
    cmp dx, bp 
    jnz coldata 
    ret 
a endp 
Begin: 
    mov ax, dseg 
    mov ds, ax 
    mov bp, 3 
    mov si, 9 
    call a 
    int 3h 
cseg ends 
end begin 

有什麼想法嗎?

+0

也許inc dx溢出並設置一個標誌,以便cmp dx,bp始終跳轉,使mov dx,0無法訪問。 –

+2

「卡住了」是什麼意思? – Ferruccio

+0

難道是你在寫代碼段嗎?我真的不知道你的意思是「被卡住」,所以我只是猜測。不過,如果你不是在源代碼中調試,而是在內存中調試,你應該看看指令是否已經改變。 – Devolus

回答

0

我想通了:

的TD被凍結的原因是,我調用該函數的位置是遠離功能本身。

我只是將該函數複製到更近的位置(在代碼中)到我稱之爲它的地方。這也是這個函數從頭到尾完美運行的原因,當我將它運行在一個新程序上時,在另一個程序中,函數和我稱之爲函數的地方之間沒有太大的空間差異。

+0

這不太可能是真正的問題。更改程序的可能性更大一些,你也可以修改你的版本,以便符號信息文件與源代碼和可執行文件相匹配。 –