[ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 26.05.09
Prihlásený: 27.05.09
Príspevky: 2
Témy: 1 | 1
NapísalOffline : 26.05.2009 18:29 | Asembler prevod

Zdravim mam taky problem. mal som za ulohu urobit v nasm takuto ulohu :
"Načítajte z klávesnice reťazec znakov ukončených znakom konca riadku. Vstup spracúvajte ako
reťazec číslic. Nech tento reťazec predstavuje celé číslo v osmičkovej sústave. Zobrazte toto číslo v binárnom inverznom kóde na 12 bitoch."

Nasiel som jednu takuto ulohu len to zobrazovalo v 10tkovej sustave... no a ja by som to potreboval v tej dvojkovej sustave v inverznom kode na 12 bitoch .. velmi sa do toho nevyznam a dost by mi to trebalo ... nasiel by sa niekto kto by mi s tym pomohol? odvdacim sa dakujem....

tu je vypis tej ulohy ktoru mam :
Kód:
TITLE zadanie2.asm
.MODEL SMALL
.STACK 400
.DATA
      lf       DB 13
      cr       DB 10
      output1  DB 'Zadal(a) si $'
      output2  DB ' v desiatkovej sustave.',13,10,'$'
      char     DB 0
      howmuch  DB 0,0
      tabulka  DB '0123456789ABCDEF'
.CODE

;-------------------------------------
newline MACRO  ; makro pre novy riadok
        push ax
        push dx
        mov ah,02h ;DOS funkcia vypisu znaku
        mov dl,CR ;znak carriage return -navrat na zaciatok riadku
        int 21h
        mov dl,LF;znak line feed -novy riadok
        int 21h
        pop dx
        pop ax
        ENDM
;------------------------------------------------
viewDec PROC ;procedura na zobrazenie cisla v decimalnom kode parametrom je cislo ulozene v bufferi !!!!!16bit cislo!!!!
     push bp        ;ulozenie ukazovatela na aktualnu poziciu zasobnika
     mov bp,sp
     push ax  ;na zaciatku procedury ulozime do zasobnika stare obsahy registrov
     push bx
     push cx
     push dx
    
            mov cx,00h ;nastavenie premennych
            mov dh,00h
            mov bx,0000h

            mov ax,[bp+4] ;nacitanie zo zasobnika cislo na zobrazenie
nocheinmal: mov cx,10
       mov dx,0000h
            div cx  delenie ax desiatkou   
            inc bl inkrementacia bl
            add dl,48 ;pripocitanie ASCII nuly
            push dx ulozenie cislice do zasobnika
            cmp ax,00h
            jnz nocheinmal

            mov ah,02h
estetlac:   pop dx ;vypisanie cislice
            int 21h ;volanie prerusenia   
            dec bl ;dekrementacia bl
            jnz estetlac ;cyklus dovtedy pokial bl bude nula

            pop dx
     pop cx  ;vratenie povodnych obsahov registrov
     pop bx
     pop ax
     pop bp
    
     ret 2    
         
viewDec ENDP
;-----------------------------------------------
getc PROC NEAR    ;procedura na nacitanie znaku z klavesnice
     push bp ;parametrom procedury je offset buffera na ulozenie znaku
          mov bp,sp
     push ax   ;na zaciatku procedury ulozime do zasobnika stare obsahy registrov
     push bx
    
     mov bx,[bp+4]  ;nacitanie z zasobnika offset buffera na ulozenie znaku
     mov ah,01h  ;DOS funkcia na nacitanie znaku z klavesnice
     int 21h   ;volanie prerusenia   
     mov [bx],al   ;ulozenie znaku do buffera
          cmp al,lf   ;porovnanie s koncom riadku

     pop bx  ;vratenie povodnych obsahov registrov
     pop ax
     pop bp
    
     ret 2    
getc ENDP

;------------------------------------------------
porovnaj PROC ; procedura zistenia znaku a jeho zmena na cislo
    push bp
    mov bp,sp
    push ax
    push bx
    push cx
    push dx

    mov bx,[bp+4];ofset tabulka z ktorej porovnava znaky
    mov dx,[bp+8];znak
    mov dh,7

perioda: cmp dl,[bx]
    jz cotoje
    mov ax,bx
    sub ax,[bp+4]
    cmp ax,7
    jz tehend
    inc bx
    jmp perioda cyklus pre zistenie cislice

cotoje:  mov ax,bx ;usadenie cislice na dane miesto v cisle
    sub ax,[bp+4]
    mov cx,[bp+6];miesto
    mul cx
   

         mov bx,OFFSET howmuch  a pripocitanie k celkovemu cislu
    mov dx,[bx]
    add ax,dx
    mov [bx],ax

tehend:    pop dx
    pop cx
    pop bx
    pop ax
    pop bp
    ret 6
porovnaj ENDP
;------------------------------------------------
 start:   mov ax,@DATA ;ulozenie datoveho segmentu
          mov ds,ax  ;do ds
    
            mov bx,OFFSET char           ;pripravenie prametra procedury getc
            mov ax,0000h

cyklus:     push bx    ;sprostredkovanie parametra procedure getc cez zasobnik
       call getc  ;volanie nacitania znaku
            jz message   ;skoc na vypis
      
       cmp ah,00h
       jnz cyklus
       mov cx,[bx]      
       push cx
       inc al
       cmp al,05h;obmedzenie do pat cislic
       jz nastav

            jmp cyklus   ;skoc na nacitanie a testovanie noveho znaku

nastav:     mov ah,01h
       jmp cyklus

message:    mov cl,al
       mov ax,0001h      
message1:   push ax
       mov bx,OFFSET tabulka
       push bx
       call porovnaj
       rol ax,3
       dec cl
       jnz message1

theend:       newline  ;volanie makra newline t.j. novy riadok
       mov ah,09h ;DOS funkcia zobrazenia retazca na obrazovku
       mov dx,OFFSET output1 ;do dx dame offset zaciatku retazca
       int 21h ;volanie prerusenia

            mov bx,OFFSET howmuch
       mov ax, [bx]  ;pripravenie prametra procedury viewDec   
            push ax   ;sprostredkovanie parametra procedure viewDec cez zasobnik
            call viewDec  ;volanie zobrazenia cisla v hexa kode     

       mov ah,09h
       mov dx,OFFSET output2
       int 21h  ;volanie prerusenia
    
         
definitiv:mov ax,4c00h           ;koniec programu
          int 21h ;volanie prerusenia
 end      start
;----------------------------


Online

Skúsený užívateľ
Skúsený užívateľ
Asembler prevod

Registrovaný: 11.01.09
Prihlásený: 23.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOnline : 27.05.2009 11:58 | Asembler prevod

Program prevedie (zadané) osmičkové číslo na desiatkové, inverzne ho, následne ho spätne prevedie na osmičkové a nakoniec vypíše v binárnom tvare na dvanástich bitoch. Rozsah zadaného čísla by mal byť v rozsahu 0 - 777.

(vytvorené v MASM32, no malo by to ísť aj pre NASM. Ak nie, napíš, kde to hádže chyby)

Kód:
.MODEL small
.STACK 100h

.DATA

    vypis1 DB 'Osmickove cislo: ', 24h
    vypis2 DB 13, 10, 'Binarne cislo: ', 24h
    retazec DB 4h, 0, 5 dup(24h)            ; 3 znaky + ENTER + '$'
    not_osm_cislo DB 4 dup (30h), 24h       ; '0000' + '$'
                             
    osem_zaklad DW 8
    nasobky DB 0, 1, 8, 64
    docasny_vysledok DW 0
   
    _0 DB 30h, 30h, 30h, 24h
    _1 DB 30h, 30h, 31h, 24h
    _2 DB 30h, 31h, 30h, 24h
    _3 DB 30h, 31h, 31h, 24h
    _4 DB 31h, 30h, 30h, 24h
    _5 DB 31h, 30h, 31h, 24h
    _6 DB 31h, 31h, 30h, 24h
    _7 DB 31h, 31h, 31h, 24h
                       
                       
                       
 
.CODE       


; funkcia prevedie retazec na desiatkove cislo (pri koretknom zadani)

NaDesiatkovu PROC


    push bp
    mov bp, sp
    push bx
    push cx
    push si

    mov bx, WORD PTR [bp+4]     ; 1. parameter offset retazca
    mov cx, WORD PTR [bp+6]     ; 2. parameter cislo v osmickovej sustave
    xor si, si
   
des_loop:

    mov al, BYTE PTR [bx+si]
   
    cmp al, 30h
    jl _error
    cmp al, 39h
    jg _error

    sub al, 30h
   
    push bx
    push si
    mov si, cx
    mov bx, offset nasobky
    mov ah, al                  ; ulozene cislo 0-9
    mov al, BYTE PTR [bx+si]   
    mul ah
    add docasny_vysledok, ax
    pop si
    pop bx
   
    inc si
    loop des_loop
   
    mov ax, docasny_vysledok
    jmp _end
   
   
_error:

    mov ax, -1
   
_end:

    pop si
    pop cx
    pop bx
    pop bp
    ret 4

NaDesiatkovu ENDP 


; funkcia prevedie spatne osmickove cislo do retazca

NaOsmickovu PROC

    push bp
    mov bp, sp
    push bx
    push si
    push cx   
    push dx

    mov bx, WORD PTR [bp+4]     ; 1. parameter offset retazca
    mov ax, WORD PTR [bp+6]     ; 2. parameter cislo v desiatkovej sustave
    xor si, si
    xor dx, dx                  ; dx musi byt prazdny, lebo sa pouziva pri deleni
    mov si, 3                   ; retazec sa zacne sa vyplnovat odzadu
   
osm_loop:
       
    div osem_zaklad
    add dl, 30h
    mov BYTE PTR [bx+si], dl    ; zvysok ukladaj od konca retazca
    xor dx, dx                  ; zvysok uz nepotrebujeme
    dec si
    cmp si, 0
    jnl osm_loop   


pr_koniec:
         
    mov ax, 0        ; ziadna navratova hodnota
    pop dx
    pop cx
    pop si
    pop bx     
    pop bp
    ret 4

NaOsmickovu ENDP


start:

    mov ax, @data
    mov ds, ax
   
    mov ah, 09h
    mov dx, offset vypis1
    int 21h
   
    mov ah, 0Ah             ; nacitanie retazca
    mov dx, offset retazec
    int 21h
   
    mov ah, 09h
    mov dx, offset vypis2
    int 21h
   
    mov bx, offset retazec
    inc bx
    xor cx, cx
    mov cl, BYTE PTR [bx]   ; v cl dlzka retazca
    inc bx

             
_main:

    push cx
    push bx
    call NaDesiatkovu           ; osmickove cislo je prevedene na desiatkove
   
    and ax, 0FFFh               ; zrezanie cisla (na 12 bitov)
    xor ax, 0FFFh               ; inverzuj


    push ax                     ; inverzovane cislo spatne do osmickovej sustavy
    mov bx, offset not_osm_cislo
    push bx
    call NaOsmickovu
   
    xor si, si   
    mov bx, offset not_osm_cislo
   
                                ; a vypiseme vysledok v binarnom tvare
                               
main_loop:

    cmp BYTE PTR [bx+si], 24h   ; koniec slova
    je end_prog

    cmp BYTE PTR [bx+si], 30h
    jne l1
    mov ah, 09h
    mov dx, offset _0
    int 21h
    jmp lend
   
l1:
    cmp BYTE PTR [bx+si], 31h
    jne l2
    mov ah, 09h
    mov dx, offset _1
    int 21h   
    jmp lend

l2:
    cmp BYTE PTR [bx+si], 32h
    jne l3
    mov ah, 09h
    mov dx, offset _2
    int 21h   
    jmp lend

l3:
    cmp BYTE PTR [bx+si], 33h
    jne l4
    mov ah, 09h
    mov dx, offset _3
    int 21h     
    jmp lend

l4:
    cmp BYTE PTR [bx+si], 34h
    jne l5
    mov ah, 09h
    mov dx, offset _4
    int 21h       
    jmp lend

l5:
    cmp BYTE PTR [bx+si], 35h
    jne l6
    mov ah, 09h
    mov dx, offset _5
    int 21h   
    jmp lend

l6:
    cmp BYTE PTR [bx+si], 36h
    jne l7
    mov ah, 09h
    mov dx, offset _6
    int 21h   
    jmp lend

l7:
    cmp BYTE PTR [bx+si], 37h
    jne lend
    mov ah, 09h
    mov dx, offset _7
    int 21h   
    jmp lend
   
lend:
    inc si   
    jmp main_loop
   
   
end_prog:   
   
    mov ax, 4C00h
    int 21h
   
end start


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 26.05.09
Prihlásený: 27.05.09
Príspevky: 2
Témy: 1 | 1
Napísal autor témyOffline : 27.05.2009 18:12 | Asembler prevod

supis dikes. skompilovalo to a fachci to ... tomu velmi nerozumiem ako to robi ale ked dam zaporne cislo vypise nulky tak to ma robit? ... to jeu z jedno hlavne ze funguje a este otazka. nevedel by si mi ktomu urobit vyvojak? vyvojovy diagram,aby tam bol zakresleny ten princip toho programu. vyzaduju to tez od nas .. dikes MOC MOC MOC


Online

Skúsený užívateľ
Skúsený užívateľ
Asembler prevod

Registrovaný: 11.01.09
Prihlásený: 23.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOnline : 27.05.2009 18:46 | Asembler prevod

Tak nemá vypísať nuly, ale nespravil som ošetrenie na zlé zadanie vstupu. Funkcia NaDesiatkovu vracia -1 pri nekorektnom vstupe, teda aj pri zápornom čísle. Takže môžeš ošetriť návratovú hodnotu tejto funkcia a ošetriť tak, aby sa napr. vypísala chybová správa.
A ohľadom vývojového diagramu ti musí pomôcť niekto iný, lebo v tomto sa ja nevyznám.

//EDIT

Prikladám upravený celý kód, lebo zmeny boli vo viacerých častiach programu. Teraz to už má aj "blbuvzdornosť" :lol: :

Kód:
.MODEL small
.STACK 100h

.DATA

    vypis1 DB 'Osmickove cislo 0-777: ', 24h
    vypis2 DB 13, 10, 'Binarne cislo: ', 24h
    chyba DB 13, 10, 'Nespravne cislo!', 24h
    retazec DB 4h, 0, 5 dup(24h)            ; 3 znaky + ENTER + '$'
    not_osm_cislo DB 4 dup (30h), 24h       ; '0000' + '$'
                             
    osem_zaklad DW 8
    nasobky DB 0, 1, 8, 64
    docasny_vysledok DW 0
   
    _0 DB 30h, 30h, 30h, 24h
    _1 DB 30h, 30h, 31h, 24h
    _2 DB 30h, 31h, 30h, 24h
    _3 DB 30h, 31h, 31h, 24h
    _4 DB 31h, 30h, 30h, 24h
    _5 DB 31h, 30h, 31h, 24h
    _6 DB 31h, 31h, 30h, 24h
    _7 DB 31h, 31h, 31h, 24h
                       
 
.CODE       


; funkcia prevedie retazec na desiatkove cislo (pri koretknom zadani)

NaDesiatkovu PROC


    push bp
    mov bp, sp
    push bx
    push cx
    push si

    mov bx, WORD PTR [bp+4]     ; 1. parameter offset retazca
    mov cx, WORD PTR [bp+6]     ; 2. parameter dlzka retazca
    xor si, si
   
des_loop:

    mov al, BYTE PTR [bx+si]
   
    cmp al, 30h
    jl _error
    cmp al, 37h
    jg _error

    sub al, 30h
   
    push bx
    push si
    mov si, cx
    mov bx, offset nasobky
    mov ah, al                  ; ulozene cislo 0-9
    mov al, BYTE PTR [bx+si]   
    mul ah
    add docasny_vysledok, ax
    pop si
    pop bx
   
    inc si
    loop des_loop
   
    mov ax, docasny_vysledok
    jmp _end
   
   
_error:

    mov ax, -1
   
_end:

    pop si
    pop cx
    pop bx
    pop bp
    ret 4

NaDesiatkovu ENDP 


; funkcia prevedie spatne osmickove cislo do retazca

NaOsmickovu PROC

    push bp
    mov bp, sp
    push bx
    push si
    push cx   
    push dx

    mov bx, WORD PTR [bp+4]     ; 1. parameter offset retazca
    mov ax, WORD PTR [bp+6]     ; 2. parameter cislo v desiatkovej sustave
    xor si, si
    xor dx, dx                  ; dx musi byt prazdny, lebo sa pouziva pri deleni
    mov si, 3                   ; retazec sa zacne sa vyplnovat odzadu
   
osm_loop:
       
    div osem_zaklad
    add dl, 30h
    mov BYTE PTR [bx+si], dl    ; zvysok ukladaj od konca retazca
    xor dx, dx                  ; zvysok uz nepotrebujeme
    dec si
    cmp si, 0
    jnl osm_loop   


pr_koniec:
         
    mov ax, 0        ; ziadna navratova hodnota
    pop dx
    pop cx
    pop si
    pop bx     
    pop bp
    ret 4

NaOsmickovu ENDP


start:

    mov ax, @data
    mov ds, ax
   
    mov ah, 09h
    mov dx, offset vypis1
    int 21h
   
    mov ah, 0Ah             ; nacitanie retazca
    mov dx, offset retazec
    int 21h
   
    mov ah, 09h
    mov dx, offset vypis2
    int 21h
   
    mov bx, offset retazec
    inc bx
    xor cx, cx
    mov cl, BYTE PTR [bx]   ; v cl dlzka retazca
    inc bx

             
_main:

    push cx
    push bx
    call NaDesiatkovu           ; osmickove cislo je prevedene na desiatkove
   
    cmp ax, -1                  ; chyba
    jne next
   
    mov ah, 09h
    mov dx, offset chyba
    int 21h
    jmp end_prog

       
next:   
   
    and ax, 0FFFh               ; zrezanie cisla (na 12 bitov)
    xor ax, 0FFFh               ; inverzuj


    push ax                     ; inverzovane cislo spatne do osmickovej sustavy
    mov bx, offset not_osm_cislo
    push bx
    call NaOsmickovu
   
    xor si, si   
    mov bx, offset not_osm_cislo
   
                                ; a vypiseme vysledok v binarnom tvare
                               
main_loop:

    cmp BYTE PTR [bx+si], 24h   ; koniec slova
    je end_prog

    cmp BYTE PTR [bx+si], 30h
    jne l1
    mov ah, 09h
    mov dx, offset _0
    int 21h
    jmp lend
   
l1:
    cmp BYTE PTR [bx+si], 31h
    jne l2
    mov ah, 09h
    mov dx, offset _1
    int 21h   
    jmp lend

l2:
    cmp BYTE PTR [bx+si], 32h
    jne l3
    mov ah, 09h
    mov dx, offset _2
    int 21h   
    jmp lend

l3:
    cmp BYTE PTR [bx+si], 33h
    jne l4
    mov ah, 09h
    mov dx, offset _3
    int 21h     
    jmp lend

l4:
    cmp BYTE PTR [bx+si], 34h
    jne l5
    mov ah, 09h
    mov dx, offset _4
    int 21h       
    jmp lend

l5:
    cmp BYTE PTR [bx+si], 35h
    jne l6
    mov ah, 09h
    mov dx, offset _5
    int 21h   
    jmp lend

l6:
    cmp BYTE PTR [bx+si], 36h
    jne l7
    mov ah, 09h
    mov dx, offset _6
    int 21h   
    jmp lend

l7:
    cmp BYTE PTR [bx+si], 37h
    jne lend
    mov ah, 09h
    mov dx, offset _7
    int 21h   
    jmp lend
   
lend:
    inc si   
    jmp main_loop
   
   
end_prog:   
   
    mov ax, 4C00h
    int 21h
   
end start


//EDIT

Tak prikladám ešte aj diagram.

Asembler prevod


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 20.03.10
Prihlásený: 15.05.10
Príspevky: 1
Témy: 0 | 0
NapísalOffline : 21.04.2010 9:45 | Asembler prevod

A nevedel by si to spravit takto?
"Načítajte z klávesnice reťazec znakov ukončených znakom konca riadku. Vstup spracúvajte ako
reťazec číslic. Nech tento reťazec predstavuje celé číslo v DESIATKOVEJ sústave. Prevedte do OSMICKOVEJ sustavy a vysledok vytlacte .

Tušim tam treba prehodit len par veci ale ja som do toho blb :loony: :oops: :( nemohol by si mi stym pomoct? dakujem velmi pekne ;)


 [ Príspevkov: 5 ] 


Asembler prevod



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Plis,asembler help:(surne

v Assembler, C, C++, Pascal, Java

2

939

25.08.2007 15:01

cinges

V tomto fóre nie sú ďalšie neprečítané témy.

Asembler zrychlenie vykonavania cyklu

v Assembler, C, C++, Pascal, Java

6

486

05.03.2013 19:25

n0sf3ratus

V tomto fóre nie sú ďalšie neprečítané témy.

Pascal,Asembler a Win XP

v Assembler, C, C++, Pascal, Java

1

1601

14.11.2005 22:01

JanoF

V tomto fóre nie sú ďalšie neprečítané témy.

Asembler- vystup desiatkovo---pls surne

v Assembler, C, C++, Pascal, Java

1

882

20.03.2010 20:42

Fico

V tomto fóre nie sú ďalšie neprečítané témy.

[Asembler] pocet malych a velkych pismen

v Assembler, C, C++, Pascal, Java

5

538

13.04.2015 20:31

TieSTiK

V tomto fóre nie sú ďalšie neprečítané témy.

ASEMBLER:Určte počet slov obsahujúcich reťazec ASM alebo asm

v Assembler, C, C++, Pascal, Java

7

1465

25.03.2011 10:07

dury26

V tomto fóre nie sú ďalšie neprečítané témy.

prevod cisiel

v Assembler, C, C++, Pascal, Java

1

603

22.02.2011 15:13

Fico

V tomto fóre nie sú ďalšie neprečítané témy.

prevod cisiel

v Delphi, Visual Basic

2

705

01.03.2010 21:11

vama

V tomto fóre nie sú ďalšie neprečítané témy.

Prevod peňazí

v Ekonomika, práca, biznis, podnikanie a peniaze

9

842

26.10.2011 22:22

tairikuokami

V tomto fóre nie sú ďalšie neprečítané témy.

Prevod domeny

v Domény

0

937

16.10.2009 19:50

M4rek

V tomto fóre nie sú ďalšie neprečítané témy.

EA prevod

v Obchody, reklamácie a právo

9

575

23.02.2011 22:13

stiffy

V tomto fóre nie sú ďalšie neprečítané témy.

Prevod mien

v PHP, ASP

4

2418

01.05.2009 19:46

pkrajnak

V tomto fóre nie sú ďalšie neprečítané témy.

PREVOD obrazkov

v Webdesign

5

796

09.07.2007 10:56

kmsa

V tomto fóre nie sú ďalšie neprečítané témy.

prevod do 3gp

v Ostatné programy

2

1124

23.10.2006 22:48

maciakba

V tomto fóre nie sú ďalšie neprečítané témy.

Prevod formátu videa

v Video programy

18

1679

08.02.2010 18:09

cezet

V tomto fóre nie sú ďalšie neprečítané témy.

Prevod pomocou OCR

v Grafické programy

9

1056

16.10.2009 21:53

erikoo



© 2005 - 2024 PCforum, edited by JanoF