2017-05-06 72 views
0

我的程序(程序集tasm 16bit)应该为数组打印条形图represtion.Right现在它只支持特定数组,但我会添加对在将来的一般情况下。代码在调试器中正常工作,并打印出条形图。但是在运行中,代码被卡住并且无法打印任何东西。除了PrintArr之外的所有功能都按照已经分开的方式单独运行。调试器中似乎存在problame dosent,我无法找到我的调试问题。汇编(tasm)程序在运行时崩溃,但在调试器(turbo调试器)中工作正常

; 
IDEAL 
MODEL small 
STACK 100h 
DATASEG 
; -------------------------- 
; Your variables here 
; -------------------------- 
arr db 3,1,2 
screen_width dw 300 
screen_height dw 190 
plo dw 0 
var db ? 
CODESEG 
;works on tasm syntex 16 bit 
proc FindWidthForColAndSpace 
;finds the width for each col and space 
;input: 
;1.number of cols 
;2.screen width 
;ouput: 
;1.space 
;2.width 
push bp 
mov bp,sp 
push ax 
push bx 
push cx 
push dx 
mov ax,[bp+4];sceen width 
mov bx,[bp+6];number of cols 
div bx 
xor dx,dx 
mov bx,ax 
mov cx,5 
mul cx 
xor dx,dx 
mov cx,100 
div cx 
xor dx,dx 
sub bx,ax 
mov [bp+4],ax 
mov [bp+6],bx 
pop dx 
pop cx 
pop bx 
pop ax 
pop bp 
ret 
endp FindWidthForColAndSpace 
proc FindHeight 
;finds the pixel repsention for 
;input: 
;1.screen height 
;2.highest value 
;3.lowest value 
;ouput: 
;1.height 
push bp 
mov bp,sp 
push ax 
push bx 
push cx 
push dx 
xor dx,dx 
mov cx,[bp+4];lowest value 
mov bx,[bp+6];highest value 
mov ax,[bp+8];screen height 
div bx 
mov [bp+8],ax 
pop dx 
pop cx 
pop bx 
pop ax 
pop bp 
ret 4 
endp FindHeight 
proc PrintLine 
;prints a line 
;1.length 
;2.colour 
;3.x 
;4.y 
push bp 
mov bp,sp 
push ax 
push bx 
push cx 
push dx 
push si 
mov cx,[bp+10];leangth 
mov dx,[bp+4];y 
mov al,[bp+8];colour 
mov si,[bp+6];x 
mov ah,0ch 
xor bx,bx 
pl: 
    push cx 
    mov cx,si 
    int 10h 
    inc si 
    pop cx 
loop pl 
pop si 
pop dx 
pop cx 
pop bx 
pop ax 
pop bp 
ret 8 
endp PrintLine 
;clean screen 
proc Cls 
push ax 
push cx 
mov cx,200 
xor ax,ax 
Clean: 
    push 320 
    push 0 
    push 0 
    push ax 
    call PrintLine 
    inc ax 
loop Clean 
pop cx 
pop ax 
ret 
endp cls 
proc PrintSquare 
;print a square 
;input: 
;1.height 
;2.leangth 
;3.colour 
;4.x 
;5.y 
push bp 
mov bp,sp 
push ax 
push bx 
push cx 
push dx 
push di 
push si 
mov cx,[bp+12] 
mov ax,[bp+10] 
mov bx,[bp+8] 
mov dx,[bp+6] 
mov di,[bp+4] 
xor si,si 
print: 
mov di,[bp+4] 
push ax 
push bx 
push dx 
sub di,si 
push di 
call PrintLine 
inc si 
loop print 
pop si 
pop di 
pop dx 
pop cx 
pop bx 
pop ax 
pop bp 
ret 10 
endp PrintSquare 
proc PrintArr 
;prints a array 
;1.strat of the array(offset) 
;2.end of the array (offset) 
;output 
;none 
push bp 
mov bp,sp 
push ax 
push bx 
push cx 
push dx 
push di 
push si 
mov bx,[bp+6];strat of the array(offset) 
mov ax,[bp+4];end of the array (offset) 
mov cx,[screen_width] 
push 3 
push cx 
call FindWidthForColAndSpace 
pop dx;space widfth 
pop di;cooloum width 
mov cx,[screen_height] 
push cx 
push 3 
push 1 
call FindHeight 
pop si;height(dyamnic height *value =pixels) 
mov cx,3 
xor ax,ax 
printar: 
    xor ax,ax 
    mov al,[byte ptr bx] 
    push dx 
    xor dx,dx 
    mul si 
    pop dx 
    push ax 
    push di 
    push 4 
    push [plo] 
    push [screen_height] 
    call PrintSquare 
    mov ah,1 
    int 21h 
    inc bx 
    push ax 
    mov ax,[plo] 
    add ax,dx 
    add ax,di 
    mov [plo],ax 
    pop ax 
loop printar 
pop si 
pop di 
pop dx 
pop cx 
pop bx 
pop ax 
pop bp 
ret 4 
endp PrintArr 
start: 
mov ax, @data 
mov ds, ax 
mov ax,13h 
int 10h 
call cls 
push 0 
push 2 
call PrintArr 
mov ah,1 
int 21h 

; push 10 
; push 5 
; push 4 
; push 100 
; push 100 
; call PrintSquare 
; mov ah,86h 
; int 15h 
;call cls 
exit: 
    mov ax, 4c00h 
    int 21h 
END start 
+0

*“我试图调试它,但没有结束。”*发生了什么事?此外,我试图读取您的代码,但没有结束,因为它的格式很差,没有缩进或空白。 –

+0

没有理由是有毒的。正如我上面提到的,我检查了代码,它的代码很好,我的整个预测是代码在dbeugger中工作正常,但是在运行时崩溃。我是编程的新手,特别是如果您对如何更好地格式化我的代码有任何建议,我会很乐意听到他们的意见。 – hjsv41

回答

2

Turbo Debugger在加载程序时将一堆寄存器设置为0。当MS-DOS启动时,这些寄存器是而不是设置为空。其注册信息需要空就可以实现通过在启动过程的开头添加

xor ax, ax 
xor bx, bx 
xor cx, cx 
xor dx, dx 
xor si, si 
xor di, di 
xor bp, bp 

,并通过注释掉它先后。事实证明,违规行为是DX。因此,搜索第一个在该寄存器中预计为空的函数或指令。我在FindWidthForColAndSpace的第div指令中找到它。这div执行DX:AX/BX,因此需要在DX值。线xor dx, dx跟在div之后是否意外?它必须在它前面。

+0

这就解决了我的问题。我从来不知道调试器的剂量。我不知道究竟是什么剂量我的问题。但是当我知道问题的根源是什么时,我会发现它。非常感谢 – hjsv41

相关问题