2017-05-06 1 views
0

Mein Programm (Assembly tasm 16bit) soll eine Balkendiagrammrepräsentation für ein Array drucken.Schließlich unterstützt es nur specificarray, aber ich werde Unterstützung für hinzufügen allgemeine Fälle in der Zukunft. Der Code funktioniert gut im Debugger und druckt die Bars als expcuted.But im Lauf wird der Code stecken und dosent alles drucken. Alle Funktionen außer PrintArr arbeiteten separat wie ausgeführt. Ich kann mein Problem beim Debuggen nicht finden, da das Problame-Dosent im Debugger zu existieren scheint.Assembly (tasm) Programm stürzt im run, aber funktioniert gut im Debugger (Turbo Debugger)

; 
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

* "Ich habe versucht, es zu debuggen, aber zu keinem Ende." * Was ist passiert? Außerdem habe ich versucht, Ihren Code zu lesen, aber zu keinem Ende, weil er so schlecht formatiert ist, ohne Einrückung oder Leerzeichen. –

+0

Es gibt keinen Grund, toxisch zu sein. Wie ich oben erwähnt habe, habe ich den Code benutzt und es hat gut funktioniert, mein ganzes Problem ist, dass der Code im dbeugger gut funktioniert, aber auf dem run.Ich bin neu in der Programmierung als Ganzes und Assembly in Besonders wenn Sie irgendwelche Ratschläge haben, wie ich meinen Code besser formatieren kann, werde ich mich freuen, sie zu hören. – hjsv41

Antwort

2

Turbo Debugger setzt eine Reihe von Registern auf 0, wenn es das Programm lädt. Wenn MS-DOS startet, sind diese Register nicht auf Null festgelegt. Die Informationen, die benötigt registrieren um null Sie durch Hinzufügen von

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

zu Beginn des Startvorgangs erreichen können, und indem sie sie sukzessive zu kommentieren. Es wird sich erweisen, dass der Delinquent DX ist. Suchen Sie also nach der ersten Funktion oder Anweisung, die in diesem Register eine Null erwartet. Ich fand es in der ersten div Anweisung in FindWidthForColAndSpace. Dieser div führt DX:AX/BX aus und benötigt daher einen Wert in DX. Ist es ein Unfall, dass die Linie xor dx, dx der div folgt? Es muss davor sein.

+0

Das ist mein Problem gelöst. Ich wusste nie, dass der Debugger dies dosiert. Ich weiß nicht, was genau mein Problem dosieren. Aber ich werde es finden, wenn ich weiß, was die Ursache des Problems ist. Vielen Dank – hjsv41

Verwandte Themen