x86程序冻结[tasm]

时间:2015-01-11 20:08:42

标签: assembly tasm

我有这段代码(having a string of length n, build another of length n-2 as it follows: sir2[i]=(sir[i]+sir[i+1]+sir[1+2])/3),我无法弄清楚它为什么会冻结。没有错误,我现在已经调试了一段时间,但我无法弄清楚问题是否与算法有关。

prints macro number
local  decompose, pops
    mov bx,10
    mov al, number
    mov cx,0
    decompose:  ;pushing digits to the stack
        inc cx
        mov ah,0
        div bl
        mov dl,ah   ; remainder - last digit
        add dx,48   ; to transform it in its char version
        push dx
        cmp al,0
        jnz decompose
    pops:               ; pop digits off the stack
        pop dx
        mov ah,2h
        int 21h
    loop pops
        ; pretty spacing
        mov dl,' '
        mov ah,2h
        int 21h

endm

data segment para public 'data'
    sir db 5, 10, 12, 4, 3
    n equ $-sir
    sir2 db n-2 dup(0)
data ends

code segment para public 'code'
start proc far
    assume cs:code,ds:data
    push ds
    xor ax,ax
    push ax
    mov ax,data
    mov ds,ax

    mov si,0
    mov dx,3
    mov cx,n
    sub cx,2

l1:
    mov ah,0
    mov al,sir[si]
    add al,sir[si+1]
    add al,sir[si+2]    ;sum of 3 numbers
    div dx                  ;sir2[i]=(sir[i]+sir[i+1]+sir[1+2])/3
    mov sir2[si],al
    inc  si
    cmp si,cx
jbe l1

    mov si,0
l2:
   prints sir2[si]
    inc si
loop l2

ret
start endp
code ends
end start

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

DIV r/m16的说明是"#{1}}" 的无符号除DX:AX。换句话说,分子是由r/m16DX中的位组合形成的32位值。
如果商变得太大而不适合AX一个例外。为避免这种情况,您应在分割前清除AX(即DXmov dx,0)。显然,这也意味着您不能使用xor dx,dx作为分母。

答案 1 :(得分:1)

更改

div dx                  ;sir2[i]=(sir[i]+sir[i+1]+sir[1+2])/3

div dl                  ;sir2[i]=(sir[i]+sir[i+1]+sir[1+2])/3

(见迈克尔的答案)。

宏是一段插入的代码"按原样#34;在调用宏的地方。宏prints更改CX,您需要更改loop l2。重写循环:

    mov si, 0
    mov di, cx
l2:
    prints sir2[si]
    inc si
    dec di
    jnz l2
顺便说一句:别忘了定义一个堆栈:

_STACK SEGMENT PARA STACK 'STACK'
    dw  1024 dup (?)
_STACK ENDS

答案 2 :(得分:1)

您的程序可能会冻结,因为您进行的迭代太多了!

cmp si,cx
jbe l1

这提供了4次迭代,而 sir2 只有3个字节的存储空间!使用jb l1