Diskuze: Vyšší/strojové skoky

C++ C a C++ Vyšší/strojové skoky

Avatar
RickettsialPox:

Bratr dělá knížku pro dalšího bratra - základy programování. A tak jsem mu vysvětlil, že skok strojový jest (podmíněná - jle, jqe, ja, jb, jl, jc, jz,...) změna hodnoty IP - Instruction Pointer (ukazatel právě vykonávaného opcode). Kdežto skok v chráněném systému - vyšší skok, je přesun ve virtuální paměti - haldě. Ale on mne dokázal dokonale zmást. Jelikož tvrdí, že cyklus není nic jiného, než obyčejný vyšší skok (goto), který vznikl jen pro přehlednost, jelikož se v blocích kódu ohraničených skoky (goto) programátoři ztráceli. Má pravdu? Pokud ano, proč tedy tolik lidí bojuje proti těmto skokům? (Pokud se jedná jen o přehlednost.) Ale co více, je tedy i ve virtuální paměti daleko výkonější strojový skok? Poněvadž co mi paměť slouží, tak v chráněném režimu se vlastně strojový kód nedá spustit, nýbrž se virtualizuje.
Za uvedení na správnou míru děkuji.

Editováno 9.3.2014 22:02
Odpovědět  +1 9.3.2014 22:00
Nikdy nikdo nikým není, dokud nevěří.
Avatar
Michal
Člen
Avatar
Odpovídá na RickettsialPox
Michal:

Code is worth thousand words :))

FOR LOOP VERZE:

INCLUDELIB OLDNAMES

PUBLIC  ??_C@_02DPKJAMEF@?$CFd?$AA@                     ; `string'
EXTRN   __imp__printf:PROC
EXTRN   @__security_check_cookie@4:PROC

_TEXT   SEGMENT
_main   PROC                                            ; COMDAT

; 4    : {

        push    esi
        push    edi

; 5    :        for (int i = 0; i < 10; ++i)

        mov     edi, DWORD PTR __imp__printf
        xor     esi, esi
        npad    6
$LL3@main:

; 6    :                printf("%d", i);

        push    esi
        push    OFFSET ??_C@_02DPKJAMEF@?$CFd?$AA@
        call    edi
        inc     esi
        add     esp, 8
        cmp     esi, 10                                 ; 0000000aH
        jl      SHORT $LL3@main

; 7    : }

        pop     edi
        xor     eax, eax
        pop     esi
        ret     0
_main   ENDP
_TEXT   ENDS
END

GOTO VERZE:

INCLUDELIB OLDNAMES

PUBLIC  ??_C@_02DPKJAMEF@?$CFd?$AA@                     ; `string'
EXTRN   __imp__printf:PROC
EXTRN   @__security_check_cookie@4:PROC
;       COMDAT ??_C@_02DPKJAMEF@?$CFd?$AA@
CONST   SEGMENT
??_C@_02DPKJAMEF@?$CFd?$AA@ DB '%d', 00H                ; `string'
CONST   ENDS
PUBLIC  _main
; Function compile flags: /Ogtp
; File c:\users\michal\documents\visual studio 2013\projects\c++console\c++console\main.cpp
;       COMDAT _main
_TEXT   SEGMENT
_main   PROC                                            ; COMDAT

; 4    : {

        push    esi
        push    edi

; 5    :        int i = 0;

        mov     edi, DWORD PTR __imp__printf
        xor     esi, esi
        npad    6
$label$9:

; 6    : label:
; 7    :        printf("%d", i);

        push    esi
        push    OFFSET ??_C@_02DPKJAMEF@?$CFd?$AA@
        call    edi

; 8    :        ++i;

        inc     esi
        add     esp, 8

; 9    :        if (i<10)

        cmp     esi, 10                                 ; 0000000aH
        jl      SHORT $label$9

; 10   :                goto label;
; 11   : }

        pop     edi
        xor     eax, eax
        pop     esi
        ret     0
_main   ENDP
_TEXT   ENDS
END
Editováno 13.3.2014 17:37
Nahoru Odpovědět  +1 13.3.2014 17:35
Don’t worry if it doesn’t work right. If everything did, you’d be out of a job.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Nahoru Odpovědět  -1 13.3.2014 17:39
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Luboš Běhounek (Satik):

Goto je v podstatě jen nepodmíněný skok jmp .

Cyklus nebo podmínka pak jsou v podstatě skoky podmíněné zapsané trochu přehledněji a dělají o něco víc než jen ten skok, ale samozřejmě do asm se přeloží jako podmíněný skok (+ta podmínka, inicializace apod.).

Hlavní výhoda je v tom, že pokud máš kód protkaný tímhle, tak se v tom brzy ztratíš, protože na první pohled nevíš, jestli je to jen podmínka nebo cyklus a taky kompilátor ten kód obvykle dokáže mnohem lépe zoptimalizovat, když ví, jestli před sebou má podmínku nebo třeba cyklus nebo nějaký paskvil :)

Nahoru Odpovědět  ±0 13.3.2014 17:51
:)
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Zdeněk Pavlátka
Zdeněk Pavlátka:

Co se komu nelíbilo? Aha, zapoměl jsem, že k tomuhle dotazu nepatří článek, ale komentáře pod ním...

Nahoru Odpovědět 13.3.2014 17:55
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Michal
Člen
Avatar
Michal:

Ještě odpovím na tvoji druhou otázku:
Pokud ano, proč tedy tolik lidí bojuje proti těmto skokům?
Jednoduše - protože goto se dá zneužít k delším skokům - i mezi moduly, a jeho časté užívání napomáhá ke vzniku tkzv. špagetového kódu, neboli kódu se zbytečně složitou řídící strukturou.
Když však chci provádět takovýto cyklus, for je prostě jednodušší, přehlednější a intuitivnější pro nováčky.

Ale co více, je tedy i ve virtuální paměti daleko výkonější strojový skok? Poněvadž co mi paměť slouží, tak v chráněném režimu se vlastně strojový kód nedá spustit, nýbrž se virtualizuje.
Tuhle otázku jsem částečně nepochopil. S tou virtualizací máš samozřejmě pravdu, ale jinak se mi zdá, že mícháš páté přes deváté. :) Ale mohu se mýlit, takže prosím o klarifikaci této otázky.

Nahoru Odpovědět  +1 13.3.2014 17:55
Don’t worry if it doesn’t work right. If everything did, you’d be out of a job.
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Zdravím,

mohl by mi někdo vysvětlit, jaký je rozdíl mezi pojmy strojový skok a vyšší skok? Nechápu ani, co s tím tady má dělat chráněný režim.

Povidání o tom, že v chráněném režimu se vykonávání virtualizuje, mi také přijde dost zvláštní. Ano, o přístupech do paměti by se to asi dalo tvrdit (vzhledem k mapování virtuálních adres na fyzické), ale proti HW virtualizaci je to dost slabé.

Nahoru Odpovědět 16.3.2014 11:39
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.