2017-05-06 85 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

相關問題