Assembly 组件8086-td卡滞

Assembly 组件8086-td卡滞,assembly,x86-16,Assembly,X86 16,我试图在assembly 8086上构建一个针对计算机的tic-tac-toe游戏,但每当我运行它时,TD就会被这个特定命令卡住: mov dx,0 此命令位于函数中(第三行): 此外,将应用函数中的前两个命令,但不更改寄存器 这不是我第一次遇到这个问题,它也发生在另一个函数中(在同一个程序中),类似地,函数中的前两个命令不起作用。命令是: mov-dl,13 我正试图将光标向下移动一行 我还在一个新程序上运行了这个特定的函数,它从头到尾都工作得很好,我不知道,不管怎样,这就是我尝试过的新程序:

我试图在assembly 8086上构建一个针对计算机的tic-tac-toe游戏,但每当我运行它时,TD就会被这个特定命令卡住:

mov dx,0

此命令位于函数中(第三行):

此外,将应用函数中的前两个命令,但不更改寄存器

这不是我第一次遇到这个问题,它也发生在另一个函数中(在同一个程序中),类似地,函数中的前两个命令不起作用。命令是:

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
有什么想法吗?

我想出来了:

TD被冻结的原因是我调用函数的位置远离函数本身


我只是简单地将函数复制到一个更靠近我称之为“it worked”的位置(在代码中)。这也是为什么当我在一个新程序上运行函数时,它从头到尾都工作得很好的原因,在另一个程序中,函数和调用函数的位置之间没有太大的空间差异。

可能inc-dx溢出并设置了一个标志,所以cmp-dx,bp总是跳转,使mov-dx,0无法访问。您所说的“卡住”到底是什么意思?可能是您正在写入代码段?我真的不知道你说的“卡住”是什么意思,所以我只是在猜测。不过,如果不是在源代码中调试,而是在内存中调试,则应该看到指令是否已更改。为什么基指针寄存器
bp
用作计数器
bp
通常是指向堆栈的地址。另外,
dx
在执行
mov-si,dx
add-si,dx
时似乎总是为零,因为它在示例的第4行被设置为零,并且在这两行之间没有变化。在较旧的纯汇编中,只有寄存器传递约定,我曾经看到bp有时被用作通用寄存器。一般来说,这是一件危险的事情,但在某些情况下也能奏效。这不太可能是真正的问题。更有可能的是,在更改程序时,您还以某种方式修复了构建,以便符号信息文件与源代码和可执行文件匹配。
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