OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 16.04.2024, 14:33

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 159 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6 ... 11  Další
Autor Zpráva
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 25.10.2015, 14:15 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Podle me je to deformace z Pascalu. Protoze tam to dava smysl. Bud budes recyklovat pomocne promenne nebo jich budes mit zbytecne mnoho.

Prekladac Borlandu urcite mel parametr na vystup do asm, ale jsem linej to instalovat do Dosboxu.. .)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 25.10.2015, 15:59 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3659
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
faraon píše:
Dá se tohle vyždímat z Borlandího TurboC? To by mě schválně zajímalo co vyprodukuje ten :D
Borland C++ 2.0 z roku 1991 vyprodukuje nieco taketo:
Kód:
dseg:0311                   main            proc near               ; CODE XREF: start+102p
dseg:0311
dseg:0311                   var_x           = word ptr -2
dseg:0311
dseg:0311 55                                push    bp
dseg:0312 8B EC                             mov     bp, sp
dseg:0314 4C                                dec     sp
dseg:0315 4C                                dec     sp
dseg:0316 56                                push    si
dseg:0317 C7 46 FE 64 00                    mov     [bp+var_x], 100
dseg:031C BE 20 00                          mov     si, 20h ; ' '
dseg:031F EB 11                             jmp     short loc_10332
dseg:0321
dseg:0321                   loc_10321:                              ; CODE XREF: main+23j
dseg:0321 8B 46 FE                          mov     ax, [bp+var_x]
dseg:0324 FF 46 FE                          inc     [bp+var_x]
dseg:0327 50                                push    ax
dseg:0328 B8 52 14                          mov     ax, 1452h       ; "%i\n"
dseg:032B 50                                push    ax
dseg:032C E8 36 02                          call    printf
dseg:032F 59                                pop     cx
dseg:0330 59                                pop     cx
dseg:0331 4E                                dec     si
dseg:0332
dseg:0332                   loc_10332:                              ; CODE XREF: main+Ej
dseg:0332 0B F6                             or      si, si
dseg:0334 75 EB                             jnz     short loc_10321
dseg:0336 BE 20 00                          mov     si, 20h ; ' '
dseg:0339 EB 11                             jmp     short loc_1034C
dseg:033B
dseg:033B                   loc_1033B:                              ; CODE XREF: main+3Dj
dseg:033B 8B 46 FE                          mov     ax, [bp+var_x]
dseg:033E FF 4E FE                          dec     [bp+var_x]
dseg:0341 50                                push    ax
dseg:0342 B8 52 14                          mov     ax, 1452h       ; "%i\n"
dseg:0345 50                                push    ax
dseg:0346 E8 1C 02                          call    printf
dseg:0349 59                                pop     cx
dseg:034A 59                                pop     cx
dseg:034B 4E                                dec     si
dseg:034C
dseg:034C                   loc_1034C:                              ; CODE XREF: main+28j
dseg:034C 0B F6                             or      si, si
dseg:034E 75 EB                             jnz     short loc_1033B
dseg:0350 5E                                pop     si
dseg:0351 8B E5                             mov     sp, bp
dseg:0353 5D                                pop     bp
dseg:0354 C3                                retn
dseg:0354                   main            endp


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 25.10.2015, 20:06 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Vsechny tri varianty shodne?

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 25.10.2015, 20:16 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3659
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
Vsechny tri varianty shodne?
Prve dve varianty generuju totozny kod, v zmysle toho co som napisal o alokacii vsetkych lokalnych premennych vo vsetkych blokoch naraz na zaciatku celej funkcie. Aj ked v tomto pripade je to jedno pretoze vsetky instancie premennej i su v registri SI.

Tretia varianta for(int i=... nie je podporovana (syntax error).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 26.10.2015, 09:49 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3659
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Co generuje MinGW 4.4.0:
Kód:
.text:004013CC                         ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:004013CC                                         public _main
.text:004013CC                         _main           proc near               ; CODE XREF: ___mingw_CRTStartup+F6p
.text:004013CC
.text:004013CC                         argc            = dword ptr  8
.text:004013CC                         argv            = dword ptr  0Ch
.text:004013CC                         envp            = dword ptr  10h
.text:004013CC
.text:004013CC 55                                      push    ebp
.text:004013CD 89 E5                                   mov     ebp, esp
.text:004013CF 83 E4 F0                                and     esp, 0FFFFFFF0h
.text:004013D2 53                                      push    ebx
.text:004013D3 83 EC 2C                                sub     esp, 2Ch
.text:004013D6 E8 F5 00 00 00                          call    ___make_ctors
.text:004013DB C7 44 24 1C 64 00 00 00                 mov     dword ptr [esp+1Ch], 100
.text:004013E3 31 DB                                   xor     ebx, ebx
.text:004013E5 8D 76 00                                lea     esi, [esi+0]
.text:004013E8
.text:004013E8                         loc_4013E8:                             ; CODE XREF: _main+3Bj
.text:004013E8 8B 44 24 1C                             mov     eax, [esp+1Ch]
.text:004013EC 8D 50 01                                lea     edx, [eax+1]
.text:004013EF 89 54 24 1C                             mov     [esp+1Ch], edx
.text:004013F3 89 44 24 04                             mov     [esp+4], eax
.text:004013F7 C7 04 24 64 80 40 00                    mov     dword ptr [esp], offset aI ; "%i\n"
.text:004013FE E8 AD FF FF FF                          call    _printf
.text:00401403 43                                      inc     ebx
.text:00401404 83 FB 20                                cmp     ebx, 20h
.text:00401407 75 DF                                   jnz     short loc_4013E8
.text:00401409 30 DB                                   xor     bl, bl
.text:0040140B 90                                      nop
.text:0040140C
.text:0040140C                         loc_40140C:                             ; CODE XREF: _main+5Fj
.text:0040140C 8B 44 24 1C                             mov     eax, [esp+1Ch]
.text:00401410 8D 50 FF                                lea     edx, [eax-1]
.text:00401413 89 54 24 1C                             mov     [esp+1Ch], edx
.text:00401417 89 44 24 04                             mov     [esp+4], eax
.text:0040141B C7 04 24 64 80 40 00                    mov     dword ptr [esp], offset aI ; "%i\n"
.text:00401422 E8 89 FF FF FF                          call    _printf
.text:00401427 43                                      inc     ebx
.text:00401428 83 FB 20                                cmp     ebx, 20h
.text:0040142B 75 DF                                   jnz     short loc_40140C
.text:0040142D 31 C0                                   xor     eax, eax
.text:0040142F 83 C4 2C                                add     esp, 2Ch
.text:00401432 5B                                      pop     ebx
.text:00401433 C9                                      leave
.text:00401434 C3                                      retn
.text:00401434                         _main           endp
Neviem teda ake lysohlavky pojedol autor toho kompilera (lea esi,[esi+0] a pod.) ale v kazdom pripade, pre vsetky tri pripady to generuje ten isty kod. Premenna x je na zasobniku: [esp+1Ch] a vsetky i su v ebx. Za povsimnutie stoji zaujimavy sposob akym inkrementuje (a dec. podobne) premennu x: lea edx, [eax+1].


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 26.10.2015, 10:37 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3659
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
A este pre zaujimavost Visual Studio 2008
Kód:
.text:00401010                         ; int __cdecl main()
.text:00401010                         _main           proc near               ; CODE XREF: _main_0j
.text:00401010
.text:00401010                         var_x           = dword ptr -4
.text:00401010
.text:00401010 51                                      push    ecx
.text:00401011 56                                      push    esi
.text:00401012 8B 35 30 62 40 00                       mov     esi, ds:__imp__printf
.text:00401018 57                                      push    edi
.text:00401019 C7 44 24 08 64 00 00 00                 mov     [esp+0Ch+var_x], 100
.text:00401021 BF 20 00 00 00                          mov     edi, 20h
.text:00401026
.text:00401026                         loc_401026:                             ; CODE XREF: _main+2Cj
.text:00401026 8B 44 24 08                             mov     eax, [esp+0Ch+var_x]
.text:0040102A FF 44 24 08                             inc     [esp+0Ch+var_x]
.text:0040102E 50                                      push    eax
.text:0040102F 68 3C 37 40 00                          push    offset Format   ; "%i\n"
.text:00401034 FF D6                                   call    esi ; __imp__printf
.text:00401036 83 C4 08                                add     esp, 8
.text:00401039 83 EF 01                                sub     edi, 1
.text:0040103C 75 E8                                   jnz     short loc_401026
.text:0040103E BF 20 00 00 00                          mov     edi, 20h
.text:00401043
.text:00401043                         loc_401043:                             ; CODE XREF: _main+49j
.text:00401043 8B 44 24 08                             mov     eax, [esp+0Ch+var_x]
.text:00401047 FF 4C 24 08                             dec     [esp+0Ch+var_x]
.text:0040104B 50                                      push    eax
.text:0040104C 68 40 37 40 00                          push    offset aI       ; "%i\n"
.text:00401051 FF D6                                   call    esi ; __imp__printf
.text:00401053 83 C4 08                                add     esp, 8
.text:00401056 83 EF 01                                sub     edi, 1
.text:00401059 75 E8                                   jnz     short loc_401043
.text:0040105B 5F                                      pop     edi
.text:0040105C 33 C0                                   xor     eax, eax
.text:0040105E 5E                                      pop     esi
.text:0040105F 59                                      pop     ecx
.text:00401060 C3                                      retn
.text:00401060                         _main           endp
Tak isto vsetky tri varianty vygenerovali ten isty kod.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 26.10.2015, 11:28 
Offline
Kecálek
Uživatelský avatar

Registrován: 13.05.2013, 06:28
Příspěvky: 231
Bydliště: Handlova
Has thanked: 118 times
Been thanked: 44 times
Pouzitie LEA namiesto ADD a SUB je velmi casto vydiet, udajne je to rychlejsi sposob. Ale ak sa dobre pamatam tak kazda tato instrukcia zabera 8taktov a mozno ide len o "zneprehladnenie" kodu. Priznavam ze tiez pouzivam tento sposob :-)

Odoslané z GOCLEVER HYBRID pomocou Tapatalku

_________________
MiST | Amiga 600 Furia II | Amiga 1200 ACA1231 | Sharp MZ800 | ZX Spectrum 48k | Didaktik M | Didaktik Gama | C64 U1541II | Atari 800XL | Atari 130XE U1MB+SIDE2.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 26.10.2015, 17:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3659
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Ale vratme sa od asemblera k cecku.

Napisal som spravu pre nasich bratov od inej platformy, nieco podobne ako som daval sem, ale s ucinnejsou "kompresiou" ;)
Kód:
#include <stdio.h>
main()
{ int i;
  char *c;
  char m[]="!ATARI is the best!";

  for(i=152926,
  c=m;*c++=*c+
  (i&3)+((i&4)
  <<2)+((3*!(i+
  1&3))<<2)&31|
  '@',i>>=3;);

  puts(m); }


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 26.10.2015, 18:46 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2777
Has thanked: 226 times
Been thanked: 602 times
Busy: Pěkná kostička :)

_dworkin: To mě také napadlo, s tím že spíš formace než deformace. Pascal má všechno pěkně urovnané, to je krásně navržený jazyk který umí slušně vychovávat. Ale otřel jsem se o něj jenom krátce, akorát základy a pak jsem šel do Céčka.

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 27.10.2015, 16:01 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2287
Bydliště: Brno
Has thanked: 846 times
Been thanked: 308 times
Já si včera začal číst o Assembleru. V poslední době mi bylo jasný, že se budu pohybovat někde mezi C, C++ a assemblerem. V rámci assembleru je teď největší otazník, jestli ho dám, tak je to pro mne takové největší lákadlo abych to zjistil. Konkrétně mne zajímá na Amize 020ka. Nezajímá mne syntaxe Motoroly 68000. Chci se zaměřit přesně na můj problém aby mne to nepletlo. Zatím mám o zábavu postaráno. Čtu si z Amiga Review to málo co tam na 020ku vzniklo. Třeba to bude stačit a třeba ne. Možná bych pak ocenil nějaký všeobecný pravidla v rámci programování v Assembleru. Pokud máte tip na literaturu, která bude v rámci assembleru napsána co nejnázorněji a nebude zaměřená na konkrétní procesor tak budu za něj rád. Vše co vyšlo v češtině na assembler pro Amigu by krom těch pár článku v Amiga Review mělo být jen pro 68000... .

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 27.10.2015, 23:12 
Offline
Kecálek
Uživatelský avatar

Registrován: 13.05.2013, 06:28
Příspěvky: 231
Bydliště: Handlova
Has thanked: 118 times
Been thanked: 44 times
Vobec sa neboj ze to "nedas" 68k assembler je velmi lahky a ty uz mas zaklady v programovani. Do toho !!!

_________________
MiST | Amiga 600 Furia II | Amiga 1200 ACA1231 | Sharp MZ800 | ZX Spectrum 48k | Didaktik M | Didaktik Gama | C64 U1541II | Atari 800XL | Atari 130XE U1MB+SIDE2.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 03.03.2018, 21:44 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.06.2013, 20:26
Příspěvky: 2487
Has thanked: 115 times
Been thanked: 424 times
Rád bych se zeptal: je v C nějak omezen počet parametrů předávaných programu z příkazové řádky? Jinými slovy, je pro argc definovaná nějaká maximální hodnota?

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 03.03.2018, 22:08 
Offline
Profík
Uživatelský avatar

Registrován: 20.02.2017, 01:17
Příspěvky: 806
Has thanked: 19 times
Been thanked: 48 times
Jakožto zapřisáhlý neprogramátor se ptám: co to znamená "dát assembler"? Jakože když si vybavím mé pokusy na C-64 tak to bylo jen pár instrukcí a záleželo na znalosti Commodora a jak fungují jeho obvody, aby se z toho něco poskládalo. Samotný assembler mi byl prd platný, když jsem nevěděl co kdy kde použít v jaké souvislosti.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 03.03.2018, 22:12 
Offline
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 529
Bydliště: Košice
Has thanked: 429 times
Been thanked: 265 times
Jiiira píše:
Rád bych se zeptal: je v C nějak omezen počet parametrů předávaných programu z příkazové řádky? Jinými slovy, je pro argc definovaná nějaká maximální hodnota?
Z pohľadu jazyka C je obmedzenie vo "veľkosti" typu int. Čo v praxi žiadnym obmedzením vlastne ani nie, pretože ak by aj bol typ int reprezentovaný iba 16 bitmi, tak by bol maximálny počet parametrov 32767 a to je myslím až až.
V skutočnosti je obmedzenie dané operačným systémom a to v podobe maximálneho počtu znakov v príkazovom riadku.
Pokiaľ by išlo o Windows, tak "aktuálne" API podporuje maximálne 32768 znakov v príkazovom riadku, viď. popis funkcie CreateProcess. V starších verziách Windows bola táto hodnota nižšia.

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C
PříspěvekNapsal: 03.03.2018, 22:14 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2777
Has thanked: 226 times
Been thanked: 602 times
Jiiira píše:
je pro argc definovaná nějaká maximální hodnota?

Největší číslo které se vejde do typu int v dané implementaci.
Ale nějaké omezení bude mít dost pravděpodobně operační systém nebo příkazový interpret.

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 159 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6 ... 11  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 3 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz