Assembly Beep generator (gyorsan kéne, bocs)
2012-04-15T21:13:48+02:00
2012-04-22T22:01:54+02:00
2022-07-24T03:12:23+02:00
  • Egyébként végülis ebből is tanul az ember, hogy mit lehet és mit nem.
    Mutasd a teljes hozzászólást!
  • oh.... ho.... izé.... nem is tudjam zavartságomban hogy mit mondjak......

    Király vagy!

    Nagyon köszííí, hogy ennyit foglalkoztál vele !!! Tényleg!
    Mutasd a teljes hozzászólást!
  • Na most volt egy kis ráérő időm, és érdekelt a téma, kipróbáltam megírni ezt a programot "pucéran", vagyis a C fordító és a C standard lib segítsége nélkül, assemblyben.

    Az eredményt csatoltam. A fordításához kell NASM és ALINK, a következő parancsokkal:
    nasm -f obj beeperwin32.asm alink -oPE -subsys console beeperwin32.obj

    A jó hír: maga a kód 95 bájt hosszú.

    A rossz hír: az EXE fájl 1.5KB-os. Mint rövid utánajárás után megtudtam, egy Win32 API-t hívó programnak legalább három szekciója lesz:
    1. Header
    2. Kód
    3. Import tábla
    ahol meg van kötve, hogy mindhármuknak 512-vel osztható címen kell kezdődnie a fájlban. Ezért 1.5KB alatt nem igazán lehet értelmes Windows EXE fájlt készíteni, akármennyire rövid is benne a tényleges kód.

    Na mindegy, tanulni jó volt
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Utoljára amikor Win98-at tettem a gépemre (már nem emlékszem mikor és hol), szinte bármelyik "modern" Windows XP-s kellékkel kompletten csontra tudtam fagyasztani a rendszert.... Zsír volt!

    Amúgy egyszer az életben szívesen okoznék maradandó károsodást NEM okozó kékhalált... de sajna ezt még a registry-ből sem tudtam megcsinálni az interneten írottak alapján.

    Viszont odáig eljutottam, hogy a Leőwey-s könyvtári és két tantermi gépre kékhalált imitáló képernyőkímélőt tettem fel...... ÉS BEVETTÉK!!
    A könyvtárban három napig indítgatták újra-és-újra a gépet, amíg rájöttek, hogy vicc az egész!

    Mutasd a teljes hozzászólást!
  • Tisztességes oprendszer alatt mezei program nem tud kékhalált okozni, csak a kernel vagy egy driver. (Legfeljebb a mezei program könnyen rá tudja venni a kernelt/drivert, hogy futtassa a kékhalált okozó kódot, de az ilyet sürgős hatállyal szokták javítani.)

    Utoljára nekem Windows 98 alatt sikerült felhasználói programból megfektetni a rendszert. (Ugyan nem kék halál volt, de ijesztő jelenség. Bizonyos esetekben, ha egy védett módú DOS program összeomlott, kaptál egy üzenetet, hogy most egészséges lenne minél hamarabb újraindítani a gépet, mert az oprendszer nem stabil...) A 9x-es Windowsok még nem különítették el a felhasználói programokat teljesen a hardvertől, főleg teljesítményi okokból, ezért lehetett ott ilyet csinálni.
    Mutasd a teljes hozzászólást!
  • azaz, ha szerencséd van, akkor megúszod és "nem omlik össze" a rendszered


    Ez azt jelenti, hogy akár lehetne olyan programot írni, ami kékhalált okoz ?? Ez érdekelne!
    Mutasd a teljes hozzászólást!
  • "
    Hogy érted azt, hogy 'öngyilkos'???
    "

    az általad bemásolt kód végén nincs "kilépési pont", azaz, a processzor az "OUT 61H,AL" után a memóriában levő szemetet fogja "végrehajtani" (kivéve persze, ha az assembler-ed ezt valamilyen módon lekezelte, azaz "elhelyezett oda" mondjuk egy ret-et, de ezt nem tartom valószínűnek), ennek régen (pld. a 8086/8088-as processzoroknál) beláthatatlan következményei voltak, manapság persze mivel nem sajátíthatod ki az erőforrásokat, ezért "nem annyira veszélyes" (azaz, ha szerencséd van, akkor megúszod és "nem omlik össze" a rendszered),

    szerintem olvasd végig, fusd át az itteni, prog.hu-s leírásokat:
    prog.hu >> Cikkek >> Programozási nyelvek >> Assembly >> Bevezető
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a te hozzászólásodat is!
    Igen, írt egy assembly-fórumot vezető ember nemrég egy levelet nekem, abban említette, hogy COM fordítások helytakarékosabbak... bár erről nem emlékszem sokra a DOS-os korszakból...

    Mindjárt megpróbálom visszakeresni az oldalt, ahonnét ezt leszedtem... hoppá, bejött valami érdekes:
    William Caverner's Beep Example
    Mindjárt én is tüzetesebben megnézem...

    Egyébként itt az az oldal, ahonnét ezt eredendően kimásoltam:
    DreaminCode Forum Post


    Hogy érted azt, hogy 'öngyilkos'???


    ........
    Jajjjjjj, wah, ugyanazt linkeltem me, amit Te is... wahwahwah!
    Bocsííííí...
    Mutasd a teljes hozzászólást!
  • ez ilyen formában egy ún. com program, azaz nem exe (lásd az org 100h-t), ez mondjuk "semmit" nem jelent (ha méretre gyúrsz, akkor talán jobb is, mint egy sima exe), de a végéről lehagytál valamit (szerinted miután a "végén" a 0x61-es porton kinullázta az alsó két bitet mi történik? mit csinál a processzor?),

    nekem első blikkre (maga a megszólaltatás, tehát azt leszámítva, hogy a mostani formában ez szerintem egy "öngyilkos" program, bár gondolom az assemblered szólna a "vége" miatt) jónak tűnik azt leszámítva, hogy fogalmam sincs, hogy egy adott OS-en valóban tudod-e használni; bővebb leírás/magyarázatokkal:
    Make sound from the speaker using assembly - 8253, 8255, 8284 program example in asm (mivel itt, mint "rutint" mutatják be, ezért nincs "eleje-vége"),

    DOS-ban a paramétereket a psp-n keresztül kaptad meg, erről leírás:
    Art of Assembly: Chapter Thirteen-8 - 13.3.11 The Program Segment Prefix (PSP)
    és lásd a következő fejezetet is:
    Art of Assembly: Chapter Thirteen-9 - 13.3.12 Accessing Command Line Parameters
    Mutasd a teljes hozzászólást!
  • Hi ismét, angol nyelvű fórumon találtam az alábbit:
    org 100h MOV DX,2000 ; Number of times to repeat whole routine. MOV BX,1 ; Frequency value. MOV AL, 10110110B ; The Magic Number (use this binary number only) OUT 43H, AL ; Send it to the initializing port 43H Timer 2. NEXT_FREQUENCY: ; This is were we will jump back to 2000 times. MOV AX, BX ; Move our Frequency value into AX. OUT 42H, AL ; Send LSB to port 42H. MOV AL, AH ; Move MSB into AL OUT 42H, AL ; Send MSB to port 42H. IN AL, 61H ; Get current value of port 61H. OR AL, 00000011B ; OR AL to this value, forcing first two bits high. OUT 61H, AL ; Copy it to port 61H of the PPI Chip ; to turn ON the speaker. MOV CX, 100 ; Repeat loop 100 times DELAY_LOOP: ; Here is where we loop back too. LOOP DELAY_LOOP ; Jump repeatedly to DELAY_LOOP until CX = 0 INC BX ; Incrementing the value of BX lowers ; the frequency each time we repeat the ; whole routine DEC DX ; Decrement repeat routine count CMP DX, 0 ; Is DX (repeat count) = to 0 JNZ NEXT_FREQUENCY ; If not jump to NEXT_FREQUENCY ; and do whole routine again. ; Else DX = 0 time to turn speaker OFF IN AL,61H ; Get current value of port 61H. AND AL,11111100B ; AND AL to this value, forcing first two bits low. OUT 61H,AL ; Copy it to port 61H of the PPI Chip

    Viszont egyenlőre nem tudom, hogy ez az -e, ami megoldaná a problémámat.
    Angolul azt megértem, hogy itt valamennyire szabályozva van a frekvencia, viszont kérdés, hogy az paraméteresen adható-e meg parancssorból, illetve hogy hogy lehetne módosítani úgy a kódon, hogy az idő is szabályozható legyen. (?)
    Valaki ránézne esetleg a kódra, aki ért az assembler-ekhez, és tudna erről esetleg véleményt, meglátást mondani?
    Mutasd a teljes hozzászólást!
  • Jó persze, nem azért mondtam. A pontadás egyébként is csak gesztus jellegű dolog, az elfogadás jele, ha jól tudom.

    Ezzel is sokat segítettél, tényleg köszönöm.
    Viszont ha már a témát úgy is áttették a társalgóba, addig megtartanám, amíg nem állok elő - vagy más - konkrét megoldással.


    Egyébként a csatolt állományt javítanám, ugyanis kiderült, hogy nem fut minden gépen.
    Az alábbiakban tölthető le a "javított" verzió.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Nem pontokért járok ide, én csak ennyit tudok segíteni, sok sikert!
    Mutasd a teljes hozzászólást!
  • Rendben, nagyon szépen köszönöm!

    Egyébként google-ban és a koders.com-on próbáltam keresni, de én csak olyat találtam, ami az alapszintű sípolást valósította meg (DOS-ban meg lehet oldani 8 byte-ból ), de frekvencia és hossz kontrollálásáról nem találtam semmit.

    De még egyszer köszönöm.

    Az utolsó bekezdésedet sajnos nem nagyon értem, elnézést.


    Mivel a topic-ot áttették a társalgóba (nálam szokás szerint ) még egy ideig megtartom.
    Majd ha megoldottam teljesen a programot (amikor már van működő alkalmazásom), majd megadom a pontot.

    Most sietek órára.
    Mutasd a teljes hozzászólást!
  • Itt egy fórum, ami megoldott egy hasonlót amit kérsz, bár itt nemtom, hogy megy be a command line paraméter.

    how to produce beep using assembly in 8086??
    [SOLVED] how to produce beep using assembly in 8086??

    Ha továbbra sem jó, inkább keress rá a Google val: assembly beep
    vagy ez ad pár találatot: dos beep exe

    Lehetőleg ne itt borzold a kedélyeket egy bolhapiszok beep miatt, csak mert neked extra elvárásaid vannak (2201 karaktert le tudsz pötyögni az elvárásaiddal, de a google egyszerűbb lett volna)

    Mutasd a teljes hozzászólást!
  • Nagyon jó kérdés!

    Ugyanis az a helyzet, hogy egy végtelen ciklusban bizonyos feltétel esetén kéne a csipogás - viszont már a 8. lépésnél leáll az egész, jobb esetben a 13. körül. Nem lefagy, egyszerűen először akadozik, aztán leáll a ciklus. A program simán fut tovább mindennemű hibajelzés nélkül, de egyszerűen nem reagál semmit a továbbiakban az egész nagy ciklusban sehol sem.
    Viszont a Process.Start("valami.exe")-re lecserélve a Console.Beep(x,y)-t működött rendesen a ciklus, bármennyi lépést le tudott futtatni.
    Nem tudom hogy milyen ütközés van ott a Console.Beep()-el, lehet hogy a DLL meghívások miatt bugos.
    Viszont tehát a Process.Start()-al működik.

    Ezért kéne a dolog... nagyon jó lenne, és nagyon jó lenne, ha minél kisebb lenne a dolog, ugyanis a programomnak is kicsinek kell lennie, 8 KB alatt kéne tartanom a méretét, és ugyebár a síp-generátort bele kell tegyem a programomba.


    P.S.: Mellesleg látom hogy csak átkerült ez is a társalgóba.
    Akkor legalább megmondanátok, hogy milyen kritériumokat kell hogy teljesítsen egy topic ahhoz, hogy a tudástárban maradhason?
    Mutasd a teljes hozzászólást!
  • Ha szabad kérdezni, miért nem jó közvetlenül a .NET-es programból hívni egy Beep()-et?

    szerk: Bocs, mennem kell. Egyébként se írtam volna most meg neked 0-ról DOS-ban és assemblyben, csak próbáltam volna találni egy jobb alternatívát.
    Mutasd a teljes hozzászólást!
  • Igen, igazad van, de ezeket jól tudom.
    Egyébként bocs, mert erről nem írtam, túlságosan hadartam, de akkor lényeges megjegyezni:

    Ezt a bizonyos dolgot egy kizárólag 32 bittes (tehát x86-os) asztali gépen futtatnám, egyépként sem túl jó teljesítményű rendszeren (256 MB memória, 1 GHz alatti processzor, hűtőventillátor nélküli, vírusos rendszer, stb.) futtatnám Microsoft Windows XP Professional perációs rendszeren, SP1-es szervízcsomagúval.
    A programot egyébként a .NET keretrendszerből hívnám meg az adott parancsal, de mivel ott legfőképp operációs rendszer szintű parancsokat (WinAPI, stb.) használ a feladatok elvégzésére a fejlesztőkörnyezet, szóval ugyanúgy nyitja meg az alkalmazásokat/fájlokat folyamatként, ahogy manuálisan (két kattintással rajta) tenném, ezért szerintem DOS-os alkalmazásokat is tudok futtatni.

    Nagyon várom a további válaszokat, legfőképp a méretre optimalizált megoldásokat, a leírtak szerint.

    Mutasd a teljes hozzászólást!
  • Nem az eredeti kérdésedre válasz, de fontos megjegyezni:

    A doksi szerint a Beep() egyáltalán nem működik Vistán, a Vista előtti Windowsokon a speakert próbálja használni, a Windows 7-től felfelé pedig a hangkártyát. Vagyis még a jelenlegi kódod sem fog működni minden Windowson, mérettől függetlenül.

    A DOS-t viszont azért nem erőltetném, mert egyrészt az emuláció alatt fog futni (aztán ki tudja, melyik OS hogy emulálja a speakert), másrészt 64 bites Windowson nem is fog futni egyáltalán, mert azokban már nincs benne a DOS emulációt megvalósító kód.
    Mutasd a teljes hozzászólást!
  • Hi, először is bocsi, hogy a tudástárban teszem fel a kérdésem, de nagyon jó lenne, ha gyors választ tudnék kapni - Ígérem, hogy - természetesen a pont megadása után - törlésre jelölném a témát, ha ez jelent valamit.

    Nos, csatoltam egy apró programot. Remélem letölthető alul.
    Ugyebár C-ből fordíttatott primitív kódrészlet, gondolom ez a hozzáértőbbek számára látszik is. Egész egyszerűen nem csinál mást, minthogy én parancssorban az alkalmazás neve után beírok két számot mellé, és ez alapján egy hangot hallatt; az első szám a frekvenciaérték (Hz-ben), a másik a sípolás hossza, ezredmásodpercben.
    #include <stdio.h> int main(int argc,char **argv){Beep(atoi(argv[1]), atoi(argv[2]));}

    Maga az alkalmazás a méretét és a natív kódját nézve mondhatni nem rossz, 1,5 KB... Viszont van egy olyan erős sejtésem, hogy ez lehetne még kisebb és úgymond "natívabb":
    Az, hogy mennyire független a program a rendszerkellékektől - ezt értem "natív"-ság alatt - azt azért nem tudom olyan pontosan, egyszerűen csak úgy tűnik számomra, hogy "sok" a hivatkozás, pl. az mscorlib.dll-re. De mondom, ez csak egy amatőr meglátás.
    Viszont amit gondolog, hogy erre a feladatra (sípolás parancssorból adott frekvencia és hossz alapján) egy valamiben még kisebb alkalmazást is lehetne csinálni - ez pedig sejtésem szerint az Assembly.
    Persze mintha már halottam volna, hogy Windows-os alkalmazáshoz az 512 bájtos fejléc mindig kell. Ennek az esetében így nem nagyon számíthatnék egy KB-on aluli méretre, viszont ha jól tudom, DOS-os alkalmazások tudnak még futni x86-os gépeken Windows XP-ből is.
    Mindegy, akkor már mondom a lényeg lényegét:

    Nagyon jó lenne az esetemben - bocsi, az okot most nem tudom körülírni - ha a szóban forgó feladatra (sípolás adott frekvencián és hosszon) egy méretre optimalizált assembly kódot tudnék szerezni.
    Fontos lenne az, hogy parancssoros legyen, tehát a program neve mellé kelljen beírni a két paramétert és úgy futtatni.
    Van ilyen kód valahol az interneten? Valaki hozzáértő, assembly szakértő tudna nekem utat mutatni ilyenhez?

    Előre is megköszönném a moderátornak, ha meghagyná nekem helyben úgymond ideiglenesen ezt a topicot, a hozzászólóknak pedig hogy foglalkoznak a témával!



    A viszont hallásra!
    Mutasd a teljes hozzászólást!
    Csatolt állomány
abcd