Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Autor | Správa |
---|
Registrovaný: 26.05.09 Prihlásený: 27.05.09 Príspevky: 2 Témy: 1 | 1 |
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 ;----------------------------
|
|
Registrovaný: 11.01.09 Prihlásený: 23.12.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
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
|
|
Registrovaný: 26.05.09 Prihlásený: 27.05.09 Príspevky: 2 Témy: 1 | 1 |
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
|
|
Registrovaný: 11.01.09 Prihlásený: 23.12.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
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ť" :
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.
|
|
Registrovaný: 20.03.10 Prihlásený: 15.05.10 Príspevky: 1 Témy: 0 | 0 |
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 nemohol by si mi stym pomoct? dakujem velmi pekne
|
|
Stránka: 1 z 1
| [ Príspevkov: 5 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 2 | 939 | 25.08.2007 15:01 cinges | | v Assembler, C, C++, Pascal, Java | 6 | 486 | 05.03.2013 19:25 n0sf3ratus | | v Assembler, C, C++, Pascal, Java | 1 | 1601 | 14.11.2005 22:01 JanoF | | v Assembler, C, C++, Pascal, Java | 1 | 882 | 20.03.2010 20:42 Fico | | v Assembler, C, C++, Pascal, Java | 5 | 538 | 13.04.2015 20:31 TieSTiK | | v Assembler, C, C++, Pascal, Java | 7 | 1465 | 25.03.2011 10:07 dury26 | | v Assembler, C, C++, Pascal, Java | 1 | 603 | 22.02.2011 15:13 Fico | | v Delphi, Visual Basic | 2 | 705 | 01.03.2010 21:11 vama | | v Ekonomika, práca, biznis, podnikanie a peniaze | 9 | 842 | 26.10.2011 22:22 tairikuokami | | v Domény | 0 | 937 | 16.10.2009 19:50 M4rek | | v Obchody, reklamácie a právo | 9 | 575 | 23.02.2011 22:13 stiffy | | v PHP, ASP | 4 | 2418 | 01.05.2009 19:46 pkrajnak | | v Webdesign | 5 | 796 | 09.07.2007 10:56 kmsa | | v Ostatné programy | 2 | 1124 | 23.10.2006 22:48 maciakba | | v Video programy | 18 | 1679 | 08.02.2010 18:09 cezet | | v Grafické programy | 9 | 1056 | 16.10.2009 21:53 erikoo |
|