при использовании ее, прога зацикливается, при этом ничего не выводится.
ошибка фатальная, очень долго ее искал, пока найти не удалось. если кто подскажет где она проявляется, буду очень благодарен
вот листинг(прога написана в кодировке досовской кодировке, поэтому здесь проблемы с коментариями)
Код: Выделить всё
s segment stack; ñåãìåíò ñòåêà
db 256 dup(?)
s ends
date segment; ñåãìåíò äàííûõ
a dw 23
b dw -30
c dw 42
d dw 21
date ends
code segment
assume ss:s, ds:date, cs:code
print proc near; ïðîöåäóðà âûâîäà ÷èñëà íà ýêðàí âûâîäèò ñîäåðæèìîå ðåãèñòðà ax
push bp
mov bp, sp
push ax
push dx
push cx
push si
sub sp, 6; îòâîäèì 6 áàéòîâ â ñòåêå ïîä ÷èñëî
mov dh, 1; ïî óìîë÷àíèþ ÷èñëî >= 0
mov cx, 10; îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ
cmp ax, 0;
jge pon0; åñëè ÷èñëî >= 0
mov dh, 2; åñëè ax < 0
neg ax; òî dh:= 2, ax:= abs(ax)
pon0:
push dx; ñïàñàåì çíàê
;çàïèñü öèôð ÷èñëà â ñòåê â îáðàòíîì ïîðÿäêå
xor si, si; îáíóëåíèå ñ÷åò÷èêà êîëè÷åñòâà ÷èñåë â ÷èñëå
pon1:
mov dx, 0; ax:= (dx, ax)
idiv cs:ten; ax:= (bx, ax) div 10, bx:= (bx, ax) mod 10
add dl, '0'; ïåðåâîäèì ÷èñëî â ñèìâîë
mov [bp - si], dl; ðàçìåùåíèå öèôðû â ñòåêå
inc si;
or ax, ax;
jnz pon1; åùå íå 0, ò.å. åùå íå çàêîí÷èëèñü öèôðû â ÷èñëå
;çàïèñü ìèíóñà åñëè åñòüâ ñòåê
pop dx;
cmp dh, 2
jne pon2; åñëè íåò çíàêà
mov byte ptr [bp - si], '-'; åñëè çíàê åñòü
inc si
;ïå÷àòü (ìèíóñà è ;) öèôð
pon2:
mov ah, 2; ôóíêöèÿ 02 ïðåðûâàíèÿ 21h
;dec si
mov dl, [bp - si]
int 21h; âûâîä (çíàêà ;) öèôðû íà ýêðàí
or si, si; ïðîâåðêà íà íàëè÷èå â ñòåêå öèôð
jnz pon2; åñëè åñòü, òî ïîâòîðíûé âûâîä
;âûõîä èç ïðîöåäóðû
add sp, 6
pop si
pop cx
pop dx
pop ax
pop bp
ten dw 10
print endp
begin:
mov ax, 4; ax:=4 êàê ñëîâî
imul d; (dx, ax)= 4*d= 84 dx:= 0FFFFh ax:= 0FF54h
mov d, ax; ñîõðàíåíèå 4*d
mov ax, c; ax:= c êàê ñëîâî
mov dx, 0; dx:= 0000h
idiv b; ax:= (dx, ax) div d; dx:= (dx, ax) mod d
sub d, ax; d:= 4d - (c div b) êàê ñëîâî
mov ax, a
imul ax; (dx, ax):= ax*ax
add ax, d; ax:= a*a - (c div b) + 4*d
call print
code ends
end begin