【问题标题】:assembly 8086 - td gets stuck装配 8086 - td 卡住了
【发布时间】:2013-07-08 10:54:38
【问题描述】:

我正在尝试在程序集 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

有什么想法吗?

【问题讨论】:

  • 可能 inc dx 溢出并设置了一个标志,因此 cmp dx, bp 总是跳转导致 mov dx,0 无法访问。
  • “卡住”到底是什么意思?
  • 会不会是你在写代码段?我真的不知道您所说的“卡住”是什么意思,所以我只是在猜测。不过,如果你不是在源代码中调试,而是在内存中调试,你应该看看指令是否发生了变化。
  • 一目了然,有些事情似乎不对劲。为什么基指针寄存器bp用作计数器? bp 通常是指向堆栈的地址。此外,当您执行 mov si,dxadd si,dx 时,dx 似乎始终为零,因为它在您的示例中的第 4 行设置为零,并且在两者之间没有更改。
  • 在较旧的纯汇编中,只有寄存器传递约定,我曾经看到 bp 有时用作通用寄存器。通常这样做很危险,但它可以在某些情况下起作用。

标签: assembly x86-16


【解决方案1】:

我想通了:

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

我只是将函数复制到一个更接近的位置(在代码中)到我称之为它工作的地方。这也是我在一个新程序上运行该函数时从头到尾完美运行的原因,在另一个程序中,该函数与我调用该函数的位置之间没有太大的空间差异。

【讨论】:

  • 这不太可能是真正的问题。更有可能的是,在更改程序时,您还以某种方式修复了构建,以便符号信息文件与源代码和可执行文件匹配。
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 2018-01-03
  • 2016-12-24
  • 1970-01-01
  • 2017-10-30
  • 2012-06-23
  • 2021-10-08
  • 2016-11-24
相关资源
最近更新 更多