[assembler] ósemkowy na binarny

0

Witam, czy ktoś mógłby mi pomóc przeinaczyć ten kod na prostszy bez użycia funkcji stosb lodsb etc

tekst     DB 'Podaj liczbe OCT',10,13,'$'
  tekst2    DB 'Podaj bit znaku liczby (0 dla +, 1 dla -)',13,10,'$'
  tekst3    db 'Liczba w systemie U2:',10,13,'$'
  error_mes     db 'Liczba z poza systemu OCT',10,13,'$'
  nowa_linia DB 10,13,'$'          
  naglowek   DB 11,0        ; bufor do wprowadzania
  bufor     DB 11 DUP (?)   ; tekstu
  wynik     DB 31 DUP ('$')  ; bufor na wynik
  znak DB 2 DUP ('$') ;znak liczby

.CODE
Start:
  MOV AX,@data            ; ustawienie rejestrow
  MOV DS,AX               ; segmentowych
  MOV ES,AX

  MOV DX,OFFSET tekst2       ; wyswietlenie tekstu
  MOV AH,09h
  INT 21h
  mov ah,01h
  int 21h
  mov znak,al

  MOV DX,OFFSET nowa_linia   ; wyswietlenie tekstu
  MOV AH,09h              ; "nowa linia"
  INT 21h

  MOV DX,OFFSET tekst       ; wyswietlenie tekstu
  MOV AH,09h
  INT 21h

  MOV DX,OFFSET naglowek     ; odczyt tekstu
  MOV AH,0Ah              ; z klawiatury
  INT 21h  

  MOV DX,OFFSET nowa_linia   ; wyswietlenie tekstu
  MOV AH,09h              ; "nowa linia"
  INT 21h
  MOV SI,OFFSET bufor       ; wskaznik znaku w buforze
  MOV DI,OFFSET wynik   

petla:        ; wyznaczanie cyfr binarnych
              ; przez podzial cyfry OCT na 3 cyfry BIN
  LODSB       ; wczytanie znaku z bufora do AL
  CMP AL,13   ; porownanie ze znakiem entera
  JE Sign     ; jesli enter to koniec petli
  MOV DL,AL   ; odczytany znak w DL

  cmp dl,0
  jb error
  cmp dl,7
  ja error

  SUB DL,48   ; zamiana znaku na cyfre
  SHL DL,6    ; przesuniecie o 6 bitow
  SETC AL     ; w AL najstarszy bit cyfry
  ADD AL,48   ; zamiana cyfry na znak
  STOSB       ; zapis do wyniku
  SHL DL,1    ; to samo z drugim bitem
  SETC AL      
  ADD AL,48    
  STOSB
  SHL DL,1    ; i z trzecim bitem
  SETC AL
  ADD AL,48
  STOSB
  JMP petla   ; odczyt kolejnego znaku z bufora

po wykonaniu się pętli potrzebna jest zmienna wynik zawierajaca znaki ascii 0,1 dla zamienionych liczb.

Z góry dzięks

0

wywaliłem instrukcje łańcuchowe:

  tekst      db "Podaj liczbe OCT",10,13,"$"
  tekst2     db "Podaj bit znaku liczby (0 dla +, 1 dla -)",13,10,"$"
  tekst3     db "Liczba w systemie U2:",10,13,"$"
  error_mes  db "Liczba z poza systemu OCT",10,13,"$"
  nowa_linia db 10,13,"$"
  naglowek   db 11,0        ; bufor do wprowadzania
  bufor      db 11 DUP (?)   ; tekstu
  wynik      db 31 DUP ("$")  ; bufor na wynik
  znak       db 2 DUP ("$") ;znak liczby

.code
Start:
  mov AX, @data            ; ustawienie rejestrow
  mov DS, AX               ; segmentowych
  mov ES, AX

  mov DX, offset tekst2       ; wyswietlenie tekstu
  mov AH, 09h
  int 21h
  mov ah, 01h
  int 21h
  mov znak, al

  mov DX, offset nowa_linia   ; wyswietlenie tekstu
  mov AH, 09h              ; \"nowa linia\"
  int 21h

  mov DX, offset tekst       ; wyswietlenie tekstu
  mov AH, 09h
  int 21h

  mov DX, offset naglowek     ; odczyt tekstu
  mov AH, 0Ah              ; z klawiatury
  int 21h

  mov DX, offset nowa_linia   ; wyswietlenie tekstu
  mov AH, 09h              ; \"nowa linia\"
  int 21h
  mov SI, offset bufor       ; wskaznik znaku w buforze
  mov DI, offset wynik

petla:        ; wyznaczanie cyfr binarnych
              ; przez podzial cyfry OCT na 3 cyfry BIN

  mov al, [si]; wczytanie znaku z bufora do AL
  inc si
  cmp AL,13   ; porownanie ze znakiem entera
  je Sign     ; jesli enter to koniec petli
  mov DL,AL   ; odczytany znak w DL

  cmp dl,0
  jb error
  cmp dl,7
  ja error

  sub DL,48   ; zamiana znaku na cyfre
  shl DL,6    ; przesuniecie o 6 bitow
  setc AL     ; w AL najstarszy bit cyfry
  add AL,48   ; zamiana cyfry na znak
  mov [di], al
  inc di
  shl DL,1    ; to samo z drugim bitem
  setc AL
  add AL,48
  mov [di], al
  inc di
  shl DL,1    ; i z trzecim bitem
  setc AL
  add AL,48
  mov [di], al
  inc di
  jmp petla   ; odczyt kolejnego znaku z bufora  

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