Stránka: 1 z 1
| [ Príspevkov: 24 ] | |
Autor | Správa |
---|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Zdravim
Potreboval by som trocha nakopnut. Mam spravit program v assembleri X86, ktory nacita znak a vypise jeho hodnotu v binarnom tvare. A chcem sa opytat, ze ako nato. zobrat tu vstupnu hodnotu a delit ju 2 az do 0? Alebo nejak inac.
Dakujem.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ano, dalo by sa to aj takto, ale skusim ti nacrtnut lahsi postup. ASCII znak moze byt v rozmedzi 0-255 , cize sa zmesti do 8 bitoveho registra, povedzme do registra al. Potom ti uz len staci vypisovat jednotlive bity tohto registra pocnuc najvyssim az po najnizsi nulty bit. Tento posup je omnoho jednoduchsi ako narocne delenie.
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Uz som sa dostal niekam dalej, nwm ci idem nato dobre
mam nacitany znak v registri al
Kód: loop: RCL al, 1 JC jedna txt nula ;----------- pokrac: DEC big CMP big, 0 JNZ loop JMP kon
jedna: txt jednotka jmp pokrac
txt je makro na vypis
v premennej big je 8
zatial sa to snazim vypisat
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ano, vyborne, ides na to spravne.
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Tak vypisat sa mi to podarilo. Este otazka, ako nastavim SF, Single Flag na 1. Ta je vtedy ak je zaporna hodnota a je na 7. bite, mam ju tam natvrdo napisat, alebo je nato nejaky sposob, ako ju tam dostat, do 7 bitu.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Register priznakov mozes zmenit napriklad takto:
1.) ulozis stav priznakoveho registru do zasobnika
2.) odtial ho ulozis do registra napr ax
3.) v tomto registri jednoducho nastavis priznak na logicku jendotku ( alebo nulu, uz ako potrebujes )
4.) opat ho vlozis do zasobnika
5.) a nakoniec odtial spatne prepises register priznakov
Register priznakov vyzera na 8086 takto:
Kód: Bity ( 15. - 0. ) - | - | - | - | OF | DF | IF | TF | SF | ZF | - | AF | - | PF | - | CF Zmenenie SF: Kód: pushf pop ax or ax, 80h push ax popf
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
asi to robim zle, bud mi vypise to iste, alebo pise stale 0
Kód: tes: TEST znak, 01000000b jnz single jmp koniec ;-------------------------------- single: pushf pop bx or bx, 80h push bx popf
lop2: rcl al, 1 push ax jc jed2 txt nula pokrac2: pop ax dec big2 cmp big2, 0 jnz lop2 jmp koniec
jed2: txt jednotka jmp pokrac2
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Tak moment: pisal si, ze chces nastavit SF na jednotku ( SF je siedmy bit v registri priznakov ), nie ze chces do premennej znak na siedmy bit nastavit logicku jednotku. Ak to chces do premennej, tak to je jednoduchsie:
Kód: tes: TEST znak, 01000000b jnz single jmp koniec ;-------------------------------- single: mov bx, znak or BYTE [bx], 40h ; siesty bit ( zacina sa nultym bitom ) v premennej znak sa nastavi na jednotku
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
uloha bola
Citácia: nastavte priznak SF v stavovom registri na 1 (SF sa nachadza v 7.bite)
Cize neviem ktore ztoho, ak zmenim ten SF na 1, da sa to potom nejak vypisat, ze tam ta 1 je zmenena?
Inak dakujem, za pomoc.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Uf, teraz som trocha mimo. V kazdom pripade, podla zadania to vyzera, ze mas nastavit SF, co som ti napisal tuna: http://www.pcforum.sk/assembler-binary- ... ml#1219906 ( ak si pozries tu tabulku, tak SF je siedmy bit, pocnuc nuly, takze to podla zadania sedi ). Toto nastavenie logickej jednotky sa ale vobec netyka tvojej premennej znak, zapisuje sa to do samostatneho registra priznakov. Podla jednotlivych stavov v tomto registri sa nasledne moze napriklad vetvit program cez konkretne instrukcie jz ( ZF je 1 ), jc ( CF je 1 ), atd. Cize ak zadanie potom dalej nespecifikuje nic, tak to mozno takto staci, podla vsetkeho. Ak mozes, tak sem napis cele zadanie.
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
No tiez som ztoho jelen. Ked som to teraz po niekolky krat cital, tak tam je ...podla povahy ulohy vypiste. Cize asi staci nastavit SF na 1 a vypisovat netreba nic.
Citácia: Vytvorte program, ktory najskor precita s klavesnice lubovolny znak a vypise ho na obrazovku v binarnom tvare. Potom otestujte prislusne bity precitaneho znaku a podla vysledku testu spustite vykonanie pridelenej ulohy. Vstupy aj vystupy patricne okomentujte, pripadne podla povahy ulohy vypiste na obrazovku vysledok v binarnom tvare. Vyberte a pouzite najvhodnejsie instrukcie zo skupiny logickych instrukcii daneho procesora.
ak je v 6.bite 1, potom nastavte priznak SF v stavovom registri na 1 (SF sa nachadza v 7.bite)
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Citácia: ak je v 6.bite 1, potom nastavte priznak SF v stavovom registri na 1 (SF sa nachadza v 7.bite)
Ja to chapem tak, ze ak je v sietom bite ( nezabudnut na spravne cislovanie, pocita sa od nuly! ) precitaneho znaku logicka jednotka, tak vtedy mas nastavit SF na jednotku. V opacnom pripade nie. A to je cele, ziadne dalsie vypisovanie nie je nutne, okrem toho celkoveho binarneho vypisu.
Vies si s tym poradit alebo potrebujes hint?
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
No vypisanie binarneho uz mam, aj zistenie siesteho bitu. tj 2. z lava ak dobre pocitam. Cize potom uz iba to co si pisal vyzsie ta zmena SF.
|
|
Registrovaný: 06.04.10 Prihlásený: 18.02.14 Príspevky: 47 Témy: 2 | 2 |
A co takto?
Kód: org 100h
MOV ah, 0h INT 16h ; DOS - nacitaj znak MOV bl, al ; presun znak do DL kvoli pouzitiu vypisovania pomocou AH a INT 21h
MOV cx, 08h ; pocet opakovani 8 ( velkost znaku byte) for1: RCL bl, 01h MOV ah, 02h ; DOS - vypis znak JC vypis1 ; ak CF=1 skoc na vypis1, inak vypis '0' MOV dl, '0' JMP SHORT pokracuj ; skoc na pokracuj (short, tusim 1 byte namiesto 2) vypis1: MOV dl, '1' pokracuj: INT 21h ; DOS - vypis znak v DL LOOP for1 RET
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Zdravim, No uz som to potom spravil. Dakujem za pomoc Fico-vi aj tebe Gregi555 za ochotu.
mam dalsi problem mam v retazci najst zrcity znak a zistit na ktorom je mieste. A nejako mi to nejde. Mam tam pouzit retazcove funkcie, cital som uz hocijake stranky, ale stale nie a nie prist nato ako to tam dat.
Kód: data segment precitane db 'retazec bla bla bla fffffffartrfd$' miesto dw 0 Dlzka EQU $-precitane data ends
mov si, offset precitane ; lodsb mov al,'a' mov cx,Dlzka ;cld Cyklus: inc miesto scasb je Nasiel loop Cyklus Nasiel: dec di mov dl,miesto mov ah, 2 int 21h
mov ax, 4c00h int 21h code ends end start
Toto mam ale robi to blbost, te cyklus ako keby sa stale vykonal 4x. Nech tam dam akekolvek pismenko.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
V zasade staci toto ( zrejme si mal chybu iba v tom, ze pri instrukcii scasb sa pouziva register di, nie si ):
Kód: start:
mov di, offset precitane mov al, 'a' mov cx, Dlzka cld repne scasb jnz exit ; nenaslo
; teraz je v registri di adresa, kde sa nachadza znak
sub di, offset precitane ; v di je teraz pozicia znaku - to co potrebujes. Staci uz len vypisat
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Stale mi to nejak nejde, pise mi stale to iste cislo. Dlzka retazca mi vide 53 a vzdy mi vypise, ze znak je na 62 mieste. Hocijaky.
To exit som dal dobre?
Kód: start:
mov di, offset precitane mov al, 'a' mov cx, Dlzka cld repne scasb jnz exit
exit: sub di, offset precitane vypis di
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Tu je moj kod pre NASM v linuxe ( je to 32-bitovy kod, cize aj registre su pouzite 32-bitove, ber to preto iba ako priklad ):
Kód: extern printf ; aby som sa nepiplal s vypisom, budem volat C funkciu printf
section .data s_string db 'Helo, this is sample string' ; retazec, kde sa bude hladat znak s_length dd $ - s_string ; dlzka retazca
pf_format db '%d', 10, 13, 0 ; formatovaci retazec pre printf funkciu
section .text global main
main: ; inicializacia, toto ignoruj push ebp mov ebp, esp push edi
xor eax, eax mov edi, s_string ; edi nastavime na offset nasho retazca ( v tvojom pripade di ) mov al, 'i' ; hladame znak 'i' mov ecx, [s_length] ; ecx ( cx ) nastavime na dlzku retazca cld ; direction flag zmazeme, co znaci posun dopredu repne scasb ; opakujeme instrukciu scasb, pokial sa znak nerovna pozadovanemu jnz exit ; znak sa nenasiel
print: ; tu uz je iba vypis pomocou printf ( mne sa vypise 9 ), ignoruj sub edi, s_string push edi push pf_format call printf add esp, 8 exit: ; koniec programu pop edi pop ebp mov eax, 0 ret
Tam, ako mas jnz exit len podotykam, ze tam sa program dostane len v pripade, ze sa hladany znak nenasiel, preto tam nedavaj vypis. Z tvojho kodu ti neviem povedat, preco ti to robi blbosti, tato cast, co si uviedol, vyzera spravne. Ak mozes, daj cely.
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
No mne to zas vzdy vypise dlzku retazca + 9, cize ked mam retazec 53 tak mi vypise 62.
Kód: data segment
subor db 'data.txt', 0 ; definicia suboru precitane db 100 dup(?),'$' ; tu sa bude ukladat citany subor Dlzka dw ? data ends
start: mov ax, seg data mov ds, ax mov ah, 3dh mov al, 0 mov dx, offset subor int 21h mov dx, offset precitane mov cx,1 mov bx,ax citaj: mov ah,3fh int 21h inc dx inc dlzka cmp ax, 0 jne citaj mov dx, offset precitane mov ah, 9 int 21h mov di, offset precitane mov al, 'a' mov cx, Dlzka cld repne scasb jnz exit
sub di, offset precitane ;ak dam exit sem vypise iba dlzku vypis di ;ak dam exit sem vypise dlzku+9
exit: mov ax, 4c00h ;ak dam exit sem nevypise nic int 21h code ends end start
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Zial, kedze nemam windows, nemozem to priamo vyskusat, tak ale skusim ta apson nejako navigovat. Vsimol som si len jedinu vec, ktora by mohla robit problem, ostatok vyzera spravne:
Kód: Dlzka dw ? Kód: inc dlzka
Premenna dlzka nie je inicializovana a ty ju zvacsujes o jedna. V datovom segmente ju inicializuj na nulu miesto otaznika. Ak to nepomoze, tak daj vediet, ja to nejako skusim na DOSboxe alebo podobne.
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Skusil som teda dat Kód: Dlzka dw 0 , ale bez zmeny.
Naozaj dakujem za ochotu zatial.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Po dlhsej dobe som rozbehal dosbox na linuxe a nahodil tam potrebne subory a odhalil som aj chybu V linuxe sa pouziva tzv flat pamatovy model, kde sa jednoduchsie povedane, pouziva jeden velky segment, kdezto v DOSe to tak nebolo. Instrukcia scasb sice ocakava vstupny retazec v registri di, ale tam je len offset retazca. Segmentovu cast adresy ocakava v registri es. Cize v tvojom kode staci spravit na zaciatku toto:
Kód: mov ax, seg data mov es, ax Potom, po prejdeni instrukcii scasb, uz nemusis odcitavat offset povodneho retazca ( popravde, neviem preco som to na 32-bitovom linuxe spravit musel, ale v tomto pripade je v registri di uz poradove cislo ), pre nazornost ti prikladm moj kod ( opat zjednoduseny, vytiahni si, co potrbujes ): Kód: DOSSEG .MODEL LARGE .STACK 200h
.DATA
precitane db 'Hello world!', 10, 13, '$' ; tu sa bude ukladat citany subor error db 'Error!', 10, 13, '$' znak db 0, 10, 13, '$'
.CODE ASSUME CS:@CODE, DS:@DATA
START: mov ax,@data mov ds,ax mov es,ax mov dx, offset precitane mov ah, 9 int 21h ; hladanie mov di, offset precitane mov al, 'e' mov cx, 10 ; dlzka ako konstanta cld repne scasb jz con
mov dx, offset error mov ah, 9 int 21h jmp exit
con: add di, 30h ; uprava cisla na znak. Je to iba pre jednoduchost, ratam s tym, ze ; poradie pismenka je v rozsahu 0-9
; tu uz len vypisujem vysledok, cize tu tiez pouzi svoj kod pre vypis. Staci vypisat ; cislo, ktore je v di mov ax, di mov dx, offset znak mov BYTE PTR offset znak, al mov ah, 9 int 21h exit: mov ax, 4C00h int 21h
END start
|
|
Registrovaný: 10.02.10 Prihlásený: 21.08.17 Príspevky: 67 Témy: 15 | 15 Bydlisko: Bratislava ... |
Dakujem, konecne to ide, a mozem dorobit este co treba, naozaj dakujem, za ochotu, dnes uz sa nenajde vela takych ludi, na to stym es by som asi sam neprisiel vobec. Este raz Dakujem.
Ked chcem najst posledne velke pismeno, da sa to nejakymi funkciami? Lebo spravil som to pomocou cyklu, ze prechadza vsetky velke pismena a najvyzsie poradove cislo vypise, ake bolo.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Niet zaco, kym je to v mojich silach, rad pomozem ... nie, ziadna taka instrukcia neexistuje, ktora by nejako rozlisovala velke/male pismena. Cize len pomocou nejakeho cyklu, ako si spominal a pomocou ASCII tablky si vsimnut, kde zacinaju velke pismena. Potom uz len budes niekde uchovavat precitany znak a porovnas, ci je vacsi, ako ten novo precitany ( klasicky MAX algoristmus ).
|
|
Stránka: 1 z 1
| [ Príspevkov: 24 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 2 | 378 | 10.04.2012 22:04 street_punk | | v PHP, ASP | 2 | 471 | 07.03.2009 15:57 Tominator | | v Ostatné programy | 2 | 734 | 08.09.2008 15:53 apatka | | v PHP, ASP | 4 | 414 | 16.03.2016 8:40 BX | | v Assembler, C, C++, Pascal, Java | 1 | 1534 | 10.11.2006 18:14 Marco | | v Assembler, C, C++, Pascal, Java | 0 | 742 | 01.04.2009 21:02 bbeni | | v Assembler, C, C++, Pascal, Java | 8 | 1784 | 13.03.2007 20:39 My-reC | | v Assembler, C, C++, Pascal, Java | 0 | 823 | 31.03.2009 20:10 bbeni | | v Assembler, C, C++, Pascal, Java | 5 | 1334 | 02.04.2010 20:44 Fico | | v Assembler, C, C++, Pascal, Java | 5 | 1202 | 17.10.2009 17:13 Logik | | v Assembler, C, C++, Pascal, Java | 5 | 996 | 03.09.2010 15:14 Fico | | v Assembler, C, C++, Pascal, Java | 0 | 824 | 02.02.2008 7:37 HT | | v Assembler, C, C++, Pascal, Java | 1 | 557 | 16.04.2013 22:34 XOLOO | | v Assembler, C, C++, Pascal, Java | 2 | 648 | 27.03.2009 20:33 Ivan11114 | | v Assembler, C, C++, Pascal, Java | 2 | 931 | 22.10.2007 15:04 programator | | v Assembler, C, C++, Pascal, Java | 1 | 1036 | 09.03.2010 20:27 ac.milan |
|