Stos (asm)

0

Probuje wczytac dane postaci" liczba binarnab. Mam do tego taki kod:

wczytaj:
	mov ah, 01h		
	int 21h
	cmp al, 'b'
	je binarna
	cmp al, 'd'
	je dziesietna
	cmp al, 'h'
	je szestnastkowa
	mov ah, 0
	mov bx, ax
	sub bx, 30h		
	push bx
	add cx, 1		
jne wczytaj

Wszystko dziala poprawnie dopoki nie wczytuje liczby dluzszej niz 9 bitow - inaczej pozostale bity sa ignorowane.
Zastanawiam sie czy moze nie wystepuje przepelnienie stosu czy cos w tym stylu,, ale stos mam chyba dosc duzy:

STOS1 SEGMENT stack use16
      dw 128 dup (?)
STOS1 ENDS

Gdzie wiec moze lezec blad?

0
liczenie segment
assume cs:liczenie,ss:liczenie
org 100h ; 256B stos gdy ss=prog... poza tym... mozliwy com, zamiast exe

  ; dane
  liczba dw 0   ; tu bedzie wynik 
  mnoznik dw 10 ; podstawa=mnoznik mul zapewnia 32bit wynik (odp. potraktowany)


start:
  xor  cl,cl  ; flage pierwszego znaku sobie zrobimy, bedzie potrzebna;

  @wczytaj:
  mov  ah,01h		
  int  21h
  xor  ah,ah  ; trza wyzerowac, bo sie wynik powali

  cmp  al,96
  jna  @niemale
  sub  al,32   ; upper case

  @niemale:
  and  cl,1    
  jnz  @licz   ; tylko dla pierwszego znaku nie wykona
  mov  cl,1    ; zmiana podstawy tylko w pierwszym znaku

  cmp  al,'D'       ; dec to juz jest ustawione
  je   @wczytaj

  cmp  al,'B'
  jne  @hex
  mov  [mnoznik],2  ; bin
  jmp  @wczytaj

  @hex:
  cmp  al,'H'
  jne  @licz
  mov  [mnoznik],16 ; hex
  jmp  @wczytaj

  @licz:
  cmp  al,64
  ja   @duze
  cmp  al,47
  ja   @liczby
  jmp  @error  ; za mala wartosc

  @duze:
  sub  al,7
  @liczby:
  mov  bx,word ptr cs:[mnoznik]
  sub  al,48
  cmp  al,bl
  jnb  @error2 ; za duza wartosc

  push ax
  mov  ax,word ptr cs:[liczba]
  xor  dx,dx   ; czy to w ogole potrzebne ?
  mul  bx
  pop  bx
  cmp  dx,0
  jne  @error2 ; wynik mnozenia nie miesci sie w ax ? 
  add  ax,bx
  jo   @error2 ; licznik sie przekrecil ?
  mov  word ptr cs:[liczba],ax
  jmp  @wczytaj

  @error:
  cmp  al,27   ; esc ?
  je   @koniec
  cmp  al,13   ; enter ?
  je   @koniec ; z braku laku tez koniec

  @error2:
  ; ...
  ; tu cos, co wypisze blad
  ; ...

  @koniec:
  mov  ax,4c00h
  int  21h

liczenie ends
end start

// to dziala, ale moznaby to jeszcze poprawić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1