Hirdetés
- Apple asztali gépek
- Videós, mozgóképes topik
- Intel Core i3 / i5 / i7 / i9 10xxx "Comet Lake" és i3 / i5 / i7 / i9 11xxx "Rocket Lake" (LGA1200)
- OLED monitor topic
- Hobby elektronika
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Elkezdte felszámolni a GPU-s PhysX támogatását az NVIDIA
- NVIDIA GeForce RTX 4060 / 4070 S/Ti/TiS (AD104/103)
- 3D nyomtatás
- Titán TUF módra: teszten az NVIDIA GeForce RTX 5070 Ti!
Új hozzászólás Aktív témák
-
-
vanek
tag
válasz
Jester01 #355 üzenetére
Köszönök minden segítséget, volt rá időm és összedobtam egy kódot..
Mivel sajnos még nem nagyon tiszta a regiszterek használata, így szeretném azt kérni, hogy lehetne ellenőrizni..
;Kosntans
LF equ 10
CR equ 13
Space equ 32
KOD SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:KOD, DS:DATA, SS:VEREM, ES:DATA
ANAGRAMMA PROC FAR
mov ax, DATA
mov ds, ax
mov es, ax
; főprogram
mov ax, offset szoveg
mov si, ax
call kiir
mov si, offset szo1
call olvasbill
mov si, offset szo2
call olvasbill
mov bx, offset szo1
call rendez
mov bx, offset szo2
call rendez
call hasonlit
; főprogram vége
mov ah, 4ch
mov al,00h
int 21h
;--------------------------------------------------------
olvasbill proc
push si ;si mentése
olv:
mov ah, 1h ;bios eljárás sorszáma
int 21h ;bios interrupt
cmp al, SPACE ;Space kódja
je olvasvege
cmp al, CR
je olvasvege
mov [si], al ;betű tárolása a memóriában
inc si ;a következő betű egyel magasabb mem. címre kerüljön
jmp olv ;vissza az olvasás elejére
olvasvege:
mov byte ptr [si], SPACE ;a string veget space-val lezárjuk
int 10h
pop si
ret
olvasbill endp
;--------------------------------------------------------
min proc
mov dl, [bx] ;dl-ben az elso betű
mov si, bx ;si mutasson az elejére
c1: mov al, [si] ;akt betú betöltése
cmp al, SPACE ;space, vagyis szó vége
je vege1 ;ha igen: vége
cmp al, dl ;akt. betű és az eddigi legkisebb
jae c2 ;ha az akt. nagyobb ugorjunk
mov dl, al ;jegyezzük meg mert kisebb
xchg al, [bx] ;csere
mov [si], al ;csere
c2: inc si ;köv betű
jmp c1 ;
vege1: ret ;visszatérés
min endp
rendez proc
c3: mov al, [bx] ;akt betű betölt
cmp al, SPACE ;szó vége?
je vege2 ;ha igen: vége
call min ;tegyük az elejére a legkisebbet
inc bx ;köv betű
jmp c3
vege2: ret ;eljárás vége
rendez endp
;-----------------------------------------------------------
hasonlit proc
mov si, offset szo1
mov di, offset szo2
;PUSH DS
;POP ES
cld
mov cx, 40 ;string hossza
repe cmpsb ;összehasonlít
je igen
jne nem
nem:
mov si, offset szovegnemjo ; Nem Anagramma
call kiir
ret ; Visszatérés az op. rendszerhez
igen:
mov si, offset szovegjo ; Anagramma
call kiir
ret ; Visszatérés az op. rendszerhez
hasonlit endp
;--------------------------------------------------------
betukiir proc ;al ben a kiirandó betű
mov ah, 14 ;BIOS rutin paramétere
int 10h ;10h megszakítás hívása
ret ;visszatérés
betukiir endp
;--------------------------------------------------------
kiir proc
push si
kov: mov al, [si] ;következő betű
cmp al, 0 ;0 jelzi a str végét
je strvege ;ha elértünk a végére ugrunk
call betukiir ;egy betű kiirása
inc si ;mutató a következő betűre
jmp kov ;ugrás
strvege:
pop si
ret ;eljárás vége
kiir endp
KOD ENDS
;========================================================
DATA SEGMENT PARA PUBLIC 'DATA'
szoveg db "Kerem a ket szot szokozzel elvalasztva: ",0
szovegjo db "A ket szo anagramma!",0
szovegnemjo db " A ket szo nem anagramma!",0
szo1 db 40 dup (0)
szo2 db 40 dup (0)
DATA ENDS
;========================================================
VEREM SEGMENT PARA STACK
dw 1024 dup (0)
VEREM ENDS
END ANAGRAMMAigazából a hibákra vagyok kíváncsi.. működni jól működik, szóval azzal nincs gond.
Előre is köszönöm!
-
válasz
Jester01 #345 üzenetére
Az lehet, de akkor magyarul ilyen kóddal nem is használható a VS?
Csak mert suliba meg ilyeneket hoznak példának, bár nem VS-be mutatják be, csak abba valszeg egyszerűbb lenne a debug.
Én ezen leírás alapján állítottam be dosbox-ba, azzal az masm-el ami a linken van, azzal megy is, csak fogalmam nincs hogy fordítsam le úgy, hogy legalább Turbo debugger megegye, mert mindig "Program has invalid symbol table" üzenetet dob. -
C^^
őstag
válasz
Jester01 #342 üzenetére
Közben meglett: az volt a NAGYOBB hiba, hogy a nagy jumpolgatások között volt egy olyan "ág", ahol a drága programom átugrotta a szegmensek beállítására vonatkozó részt.
Köszönöm egyébként a segítséget, valóban 81-től indexelődik a parancssorról bevitt paraméterlista. Ha lekezelem az üres entert, mint paraméter, akkor működik.
[ Szerkesztve ]
-
Dj Sügi
őstag
-
plaschil
aktív tag
válasz
Jester01 #334 üzenetére
Bocsánat de halvány lila gőzöm sincs ezeknek a feladatoknak a megoldásáról, ugyanis egész félévben kb. csak KV tábláztunk.
Ha egyet-kettőt látnék megoldva, hogy pl. soronként mi a bánatot csinál, akkor talán könnyebben menne a megértése ezeknek a feladatoknak.De megfelel nekem az is hogyha segítetek, hogyan induljak neki egy ilyen feladat megoldásának. Egyáltalán mik szükségesek hozzá. Az se baj ha angol nyelvű.
[ Szerkesztve ]
-
-
-
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #314 üzenetére
No, akkor megnézve ezt, ha jól értem ez történik:
Először:
@R1 pointer által mutatott memóriahelyen lévő érték bekerül az akkumulátorba, valamint elmentjük a "tű" első és második karakterét.Aztán belépve az első ciklusba, először jön egy nulla vizsgálat, aztán ha nem nulla az Akku tartalma (@R0), akkor jön egy kizáró vagy kapcsolat, ami az AKKU és R3 nem egyezése esetén újraindítja a ciklust és közben arrébb teszi R0-át.
Mikor megvan az első egyezés, akkor az R1 megkapja a "tű" második karakterét, valamint elmenti a "szénakazal" aktuális karakterét R4-be, és jön a ciklus 2.A második ciklus először betölti a szénakazal karakterét az akkuba, majd xor relációval megnézi, hogy egyeznek-e, ha nem, akkor kiugrik a mismatch ágra, és a szénakazal aktuális karakterétől kezdi újra keresni a loop2 az egyezéseket.
Ha nem ugrott ki, akkor jön egy lezáró nulla keresés, majd ha megvan, és mindvégig egyezés volt, akkor visszaadja R0-ban a kazal első egyező karakterét, vagy annak helyét.Köszönöm a segítséget.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #313 üzenetére
Hol találok 8051 c libraryt? Már pár napja túrom a google-t, de vagy nem értek hozzá, vagy nem tudom miért, de nem találok semmi ilyesmit.
Az strstr fgv sima C-s implementációját sem találtam meg, mindenhol csak egy példával be van mutatva, hogyan kell használni, aztán csókolom. Amiket találtam, azok meg házi kódok, de mindben van valami hiba, pl. egyéb string függvény hívások, stb.
Továbbra is az a gondom, hogy sajnos nem tudom magamtól megírni ezt az egyszerű függvényt, folyamatábrát megrajzoltam, működését értem, de hogy pl. egy memóriaterületre mutató pointert hogyan kellene megcsinálni 8051-es Assembly-n, meg léptetni arrébb, stb., na az kínai nekem.
szerk: csak nem ezt fordítottad le?
#include <stdio.h>
const char *mystrstr(const char *haystack, const char *needle)
{
if ( !*needle )
{
return haystack;
}
for ( ; *haystack; ++haystack )
{
if ( *haystack == *needle )
{
/*
* Matched starting char -- loop through remaining chars.
*/
const char *h, *n;
for ( h = haystack, n = needle; *h && *n; ++h, ++n )
{
if ( *h != *n )
{
break;
}
}
if ( !*n ) /* matched all of 'needle' to null termination */
{
return haystack; /* return the start of the match */
}
}
}
return 0;
}
int main(void)
{
const char text[] = "The quick brown fox jumps over the lazy dog.";
const char word[] = "fox";
const char *found = mystrstr(text, word);
if ( found )
{
puts(found);
}
return 0;
}[ Szerkesztve ]
-
Jester01
veterán
válasz
Jester01 #313 üzenetére
.org 0x30
; strstr
; IN: R0=haystack, R1=needle (both zero terminated)
; OUT: R0=start (points to end of haystack if not found)
; DESTROYED: ACC, R2, R3, R4
MOV A, @R1 ; 1st char of needle
MOV 3, R1 ; save a copy
INC R1
MOV 2, R1
loop1:
MOV A, @R0
JZ done
XRL A, R3
INC R0
JNZ loop1
MOV 1, R2 ; needle 2nd char ptr
MOV 4, R0 ; save haystack
loop2:
MOV A, @R0 ; next haystack
XRL A, @R1 ; next needle
JNZ mismatch
MOV A, @R0 ; check for terminator
INC R0
INC R1
JNZ loop2
MOV 0, R4 ; restore haystack
DEC R0 ; adjust to 1st char
done:
RET
mismatch:
MOV 0, R4 ; restore haystack
AJMP loop1Fogalmam sincs működik-e, most nincs kedvem kipróbálni
-
AlapVaj
csendes tag
válasz
Jester01 #303 üzenetére
Na jó, kezdek szomorú lenni, hogy nem értek hozzá. Átírtam, viszont valamiért nem ad helyes eredményt, olyat is nem anagrammának ír, ami nem az
pl alma lama, holott ez anagramma kéne legyen. Nem látom hol a hiba
A lényege, hogy a 2szóban lévő megegyezőket kinullázza, és utána megnézi, hogy egyezik e (tehát mind 0, az 1es azért van ott a szavak végén, hogy jelezze, hogy ne végtelen legye,
szo1 db 0,0,0,0...0,0,0,1
; 1. vizsgálat:XOR AX,AX ; Kinullázzuk
XOR BX,BX ; Kinullázzuk
XOR SI,SI ; KinullázzukCIKLUS:
MOV AH, [szo1 + BX] ;Betöltjök AH-be a szo1 0,1,2,3....39ik bytját
MOV AL, [szo2 + SI] ;Betöltjök AL-be a szo2 0,1,2,3....39ik bytjátCMP AH, 1 ; Mindig megnézzük utolsó lépés e ez. Utolsó betű e?
JE CIKLUS2 ; Elugrunk a másik CIKLUSBA, végeztünk az első lépéssel.CMP AH,AL ; Összehasonlítjuk a tartalmat
JE NULL ; Ha 0, tehát egyenlők
JNE ROSSZ ; Ha különböznekROSSZ: ; Ha nem egyezik a két betű
CMP AL, 1
JE HELYESBIT
INC SI ; Növeljük a regisztert
JMP CIKLUS ; Ugrunk a következő karakterreHELYESBIT:
XOR SI,SI ; 0-ra álítjuk, hogy előröl induljon
INC BX ; Az első szó második lépésére
JMP CIKLUSNULL:
MOV szo1[BX], '0' ; Betesszük a szo1 BX-ben tárolt helyére a '0' értéket
MOV szo2[SI], '0' ; Betesszük a szo2 CX-ben tárolt helyére a '0' értéket
INC BX ; Novelunk
INC SI ; Novelunk
JMP CIKLUS;2. vizsgálat:
XOR AX,AX ; Kinullázzuk
XOR BX,BX ; Kinullázzuk
XOR SI,SI ; KinullázzukCIKLUS2:
MOV AH, [szo2 + BX] ;Betöltjök AH-be a szo1 0,1,2,3....39ik bytját
MOV AL, [szo1 + SI] ;Betöltjök AL-be a szo2 0,1,2,3....39ik bytjátCMP AH, 1 ; Mindig megnézzük utolsó lépés e ez.
JE DONTES ; Elugrunk a másik CIKLUSBACMP AH,AL ; Összehasonlítjuk a tartalmat
JE NULL2 ; Ha 0, tehát egyenlők
JNE ROSSZ2 ; Ha különböznekROSSZ2: ; Ha nem egyezik a két betű
CMP AL, 1
JE HELYESBIT2
INC SI ; Növeljük a regisztert
JMP CIKLUS2 ; Ugrunk a következő karakterreHELYESBIT2:
XOR SI,SI ; 0-ra álítjuk, hogy előröl induljon
INC BX ; Az első szó második lépésére
JMP CIKLUS2NULL2:
MOV szo2[BX], '0' ; Betesszük a szo1 BX-ben tárolt helyére a '0' értéket
MOV szo1[SI], '0' ; Betesszük a szo2 CX-ben tárolt helyére a '0' értéket
INC BX ; Novelunk
INC SI ; Novelunk
JMP CIKLUS2;3. Lépés:
DONTES:
MOV SI, OFFSET szo1 ; Kialakított szó
MOV DI, OFFSET szo2 ; Másik kialakított szó
CMPSB
JE ANAGRAIGEN
JNE ANAGRANEM;------------------------------------------------------
; Végső kiírások (eredmény):ANAGRANEM:
CALL ujsor
MOV SI, offset szoveg6 ; Nem Anagramma
CALL kiiroRET ; Visszatérés az op. rendszerhez
ANAGRAIGEN:
CALL ujsor
MOV SI, offset szoveg5 ; Anagramma
CALL kiiroRET ; Visszatérés az op. rendszerhez
[ Szerkesztve ]
-
AlapVaj
csendes tag
válasz
Jester01 #298 üzenetére
Végre megtaláltam a megoldást: MOV szo1[BX], '0'
viszont nekem kéne még egy regiszter, a bx mellé amit használhatnék, van ilyen?
XX helyére, vagy mégis ebben a ciklusban, úgy hogy az XXmásképp növekedjen mert ezt szeretném tipp, hogy hogy lehetne megoldani?
CIKLUS:
MOV AH, [szo1 + BX]
MOV AL, [szo2 + XX]
CMP AH,AL
JE NULL
JNE ROSSZ
ROSSZ:
INC XX
JMP CIKLUS
NULL:
MOV szo1[BX], '0'
MOV szo2[XX], '0'
INC BX
INC XX
JMP CIKLUS -
AlapVaj
csendes tag
válasz
Jester01 #296 üzenetére
Hát kb most itt tartok, és kezdek teljesen elveszni benne: Forráskód
A lényeget pontosan megfogalmaztam, ezt kb java, vagy Cben semeddig nem tart. A cimkézéssel még biztos gondok vannak, mert 40szer szeretném ismételni. Az összehasonlítást, és a cserét, ha kell, aztán pedig az egész blokkot, fordítva.
ADAT segement, nincs hozzá, nem is annyira fontos. Inkább, hogy hogy lehet ciklust ismételni siklussal, mert azért is akadtam el, mert kevés az ált.regiszterem, verem használaton is gondolkodtam. De akkor már rettentően bonyolultá válna. hisz mindig ki be kéne pakolni.[ Szerkesztve ]
-
AlapVaj
csendes tag
válasz
Jester01 #289 üzenetére
Akkor maradok a DB-nél és hagyjuk a szavakat.
Most már csak annyi kérdésem lenne, hogy feltöltöm ezeket a szavakat így:
SZO1 DB A,s,z,t,a,l,0,0,0,0,0,...
SZO2 DB A,l,m,a,0,0,0,0,0,0...
Vagyis, gondolom így kéne kinéznie (persze, binárisan vannak bent a betűk is, csak a jobb érthetőség miatt)
szeretnék a programban hivatkozni, mondjuk a SZO1 5-ik helyére, erre van valami eltolás gondolom, és mondjuk én ezt szeretném kihasználni.
Vagy olyanra hogy tudok hivatkozni, hogy A SZO1 első adatjától mondjuk a 14-ikig, mert szeretnék pár cmp műveletet megcsinálni vele. pl a SZO2 5ik elemével. -
AlapVaj
csendes tag
válasz
Jester01 #286 üzenetére
Látom, hogy bájtokként kezeled, de jobb úgy kezelni a karaktereket, mint DW-ben?
tehát ha mondjuk
SZO1 DW 0,0,0,0,0,...,0
SZO2 DW 0,0,0,0,0,...,0
És akkor ugye STOSW kell.
Kipróbáltam, és hozzá vettem még a 8-as kódot (backspace, elég furcsa dolgokat művel), szerencsére elég halványan van megfogalmazva a feladat, így bizony nem engedünk a felhasználónak rontani
Viszont a DB, miatt azért is aggódok, mert itt ugye 40 helyre lenne szükség és 32 fölött "too complex", vagy lehet teljesen rosszul gondolom
De most egy betűt akkor egy 1 bájt hosszú területen tárolunk -
CsodaPOK
senior tag
-
DarkByte
addikt
válasz
Jester01 #263 üzenetére
ARM procira, legalább is a legtöbb Android mobilban ilyen proci van amennyire tudom. Illetve valószínűleg a libmpg123 -mat sem tudtam volna ARM optimalizációval lefordítani ha az NDK nem ilyen toolchain -el fordítana. De jogos, bocs hogy nem mondtam egyértelműen. Gondoltam elég sok közös utasítás van a két platformon.
[ Szerkesztve ]
-
DarkByte
addikt
válasz
Jester01 #260 üzenetére
Ha jól sejtem így simán egy struct elemeit is piszkálhatom assembly -ből, vagyis átadok egy pointer -t, és egymást követik sorban a tagok méretüknek megfelelően.
Ami még nem tiszta ez a stmfd, és ltmfd parancs ami elmenti és visszatölti a regisztereket memóriából, de ennek próbálok utánanézni jobban. A sok helyi változót jó lenne mind regiszterben tartani gondolom, ha maximalizálni szeretném a sebességet.
[ Szerkesztve ]
-
DarkByte
addikt
válasz
Jester01 #258 üzenetére
Húha, megvacsizom és kipróbálom, értelmezem. Köszi!
Sajna valószínűleg lesz még kérdés.
De majd igyekszem minimalizálni, guglizni.
Mod: És tényleg lehet Intel szintaxisban írni, nagyszerű! Ha jól értem az ecx -be töltöd a length értékét, míg edx -be a pointer -t és innentől kezdve csak növeled a mutatót. Gondolom esp -ben legfelül a hívási paraméterek vannak ezért kell azokat átlépni. Az edx, ecx mentését ilyenkor automatikusan megteszi a GCC vagy ezek pont olyan regiszterek amik nincsenek használatban?
[ Szerkesztve ]
-
DarkByte
addikt
válasz
Jester01 #256 üzenetére
Először is köszi a választ!
Inline assembly: megmondom őszintén ezt azért így kérdeztem, mert nem igazán értem hogy a külső assembly tárgykód hogyan linkelődik a C forráshoz. Pl. a libmpg123 -ban is van a synth.c modulnak ARM optimalizált változata: synth_arm.S Valamit itt az ASM_NAME makróval csinál, ami tovább van pre processzor definícióval víve _##xxx alakra (xxx ha jól látom az exportált név). Olvasgattam hogy constraint -ekkel lehet inline assembly utasításokat paraméterezni, de hogy így hogyan kell külön kiemelni kódot még nem találtam rá dokumentációt (valószínűleg rosszul keresem). Ezért gondoltam hogy így első körben inkább nem erőltetem a dolgot, de ha tudsz valami leírást ajánlani hozzá, megnézem.
Intel szintaxis: a linkelt kódban ahogyan néztem csak az opkód utáni adattípus jelölést lehet így kikapcsolni, egyébként a pointer hivatkozásokat ugyanúgy % -al kell jelölni például. Persze lehet hogy megint csak rosszul látom a dolgot.
EQ: tudom hogy a libmpg123 tud belső EQ -t a subband szintézis végett, viszont ez nekem nem túl hasznos, mivel több fajta audio formátummal akarok dolgozni ahogyan írtad is (FLAC lesz a következő), és így globálisan kellene tudnom ráapplikálni, illetve tervezek még egyéb DSP -ket amelyek az EQ előtt bekerülnek a láncba.
Double pointer: így képzeltem el én is, viszont nem találok rá sehol sem egy működő példát GCC assembler -éhez. Megint valószínűleg én vagyok a béna.
[ Szerkesztve ]
-
P.H.
senior tag
válasz
Jester01 #130 üzenetére
Intel (és AMD is!) optimization reference-ek szerint az egyik key optimization az inc és dec utasítások elkerülése. Mivel ezek nem változtatják a CF flaget, és mivel minden flag-módosító microop teljes flag-térképet is visszaad a lefutása végén, ezért ezeknek meg kell várniuk a (programsorrendben) előttük levő flag-módosító utasítás visszavonulását (retire Intel szóhasználattal), hogy megkapják tőle a CF tartalmát, és elkezdhessenek futni. Ezért nagyon rosszul párhuzamosíthatóak.
[mod]: Tehát épp olyan függőség alakul ki köztük, mint monduk ha
mov eax,ebx
shl eax,08h
lenne a kód.
[Szerkesztve] -
rebel56
tag
Konkrétan én se
csak annyit, hogy következő félévben kell assemblyt tanulnom és szakdolgozatot írnom. Ha belemerülnék kicsit a szakdolgozat kapcsán, akkor biztosan meglenne a tárgy is, ennyi lenne az előnye.
Viszont a nulláról induló féléves anyagban szerintem nem jutnánk el annyira messzire, hogy ki tudjunk fejteni egy hasonló kaliberű témát.
Az is lehet, hogy viszek majd valami formabontó saját ötletet. Pl. Az argentin erdei csótányok szaporodásbiológiája assembly nyelven algoritmizálva.Ha ezt beadnám mit szólnának?
Új hozzászólás Aktív témák
- Saját tapasztalatok alapján: otthonautomatizálás védelme áramkimaradások ellen
- PlayStation 5
- Apple asztali gépek
- Bemutatta az Apple az iPhone 16e-t
- Videós, mozgóképes topik
- Intel Core i3 / i5 / i7 / i9 10xxx "Comet Lake" és i3 / i5 / i7 / i9 11xxx "Rocket Lake" (LGA1200)
- World of Tanks - MMO
- OLED monitor topic
- Hobby elektronika
- Kingdom Come: Deliverance II teszt
- További aktív témák...