WebHU - Programozási kérdések és válaszok

Ellenőrizze, hogy egy szám páratlan vagy páratlan (matematikai paritás)

Egy egyjegyű szám esetében szeretném tudni, hogy páratlan vagy páros (2 többszöröse). Például, ha 9-et ad, nyomtassa ki, hogy ez egy páratlan szám.

(azaz a matematikai paritást ellenőrizze, ne a számítási paritás.)

Ez van nálam:

   assume cs:cseg,ds:dseg,ss:sseg
    cseg segment
    start:  
    mov ax, dseg
    mov ds, ax  
    
    mov ah, 01h ; Here, im adding a number
    int 21h 
    
    
    
    jp even
    jnp odd  
    
    even: 
    mov ah,09
    lea dx,par
    int 21h  
    jmp exit
    odd: 
    mov ah,09
    lea dx,odd1 
    int 21h   
    jmp salir
    salir:
    mov ax,4C00h
    int 21h
    
    cseg ends 
    
    dseg segment byte         
    even Db 'Even number$'
    odd11 Db 'Odd number$'
    dseg ends  
    
    sseg segment stack
    db 100h dup(?)
    sseg ends

end start
27.03.2015

Válaszok:


1

Annak ellenőrzéséhez, hogy egy szám páratlan vagy páratlan, ellenőrizze ennek a számnak a 0. bitjét. ha a bit0 be van állítva, akkor a szám páratlan. semmi más. Ne keverje össze a PF (paritásjelző) és a JP/JNP feltételeket. A paritásjelző megmutatja, hogy a legkisebb jelentőségű bájtban beállított bitek száma páros vagy páratlan.

A dokumentációból:

PF (bit 2) Parity flag — Akkor állítsa be, ha az eredmény legkisebb jelentőségű bájtja páros számú 1 bitet tartalmaz; különben törölve.

1. szám – páratlan szám, 00000001b A PF törlődik, mert csak egy bit van beállítva
2. szám – páros szám, 00000010b, de a PF ismét törlődik! mert csak egy bit van beállítva
3. szám - páratlan szám, 00000011b, de PF készlet! mert két bit van beállítva

27.03.2015
  • @TheLogicGuy: test eax, 1 15.09.2017
  • Vagy még jobb: test al, 1, mert nincs test r32, imm8 kódolás, így rövidebb, ha csak a eax alsó bájtját olvassa be a al olvasásával. (Részleges regisztereket írni rossz, olvasni jó.) 19.11.2017

  • 2

    Míg Alexander Zhak válasza rámutatott a paritásjelzőt ellenőrző kód hibáira, a leggyorsabb módja annak, hogy az al-ban lévő szám paritását nem destruktív módon ellenőrizzük:

            test al,1
            jz even
    odd:    ...
    even:   ...
    
    30.03.2015

    3

    Annak teszteléséhez, hogy egy szám páratlan vagy páros-e, egyszerűen tolja jobbra, és ellenőrizze a átviteli jelzőt:

        mov     al, 09
        shr     al       ; shifts all bits right 1, lowest bit to carry flag
        jc      _odd     ; carry set - there was a bit in lowest position
    _even:
        ; Do something with even numbers and exit
    _odd:
        ; Do something with odd numbers and exit
    

    A hordozási zászló megértése nagyon hasznos számos kódolási trükkhöz. Például a "Parity" megszámolja a bitek teljes számát a számban, és ehhez hasonló trükköt használhatunk:

        mov    ah, 09
        xor    al, al    ; al = 0
    _loop:
        shr    ah        ; lower bit into carry flag
        adc    al, 0     ; Add 0 + carry flag to al
        and    ah, ah    ; sets Z flag if ah is zero
        bne    _loop
        ;  al now contains the total number of bits contained in ah
    
    27.03.2015
  • mínusz, ha csak egyszer tolja jobbra, és ellenőrizze a hordozás jelzőt, amely megsemmisíti az ellenőrzött adatokat 27.03.2015
  • Csak azt akarja tudni, hogy páratlan vagy páros-e, ne használja újra. 1 utasítás bájt és memória-hozzáférési többlet nélkül a leghatékonyabb módja annak, hogy ellenőrizze, ha nem fogja újra használni az értéket (ami nincs benne a kódjában). 27.03.2015
  • @Mike: A test al,1 / jnz _odd jelentősen hatékonyabb, mint egy műszak. Az Intelen a Core2 óta, az AMD-n pedig a Bulldozer óta, ez egyetlen teszt-és-ágazatú uop-ba tud makrózni. A shr al és a test al,1 egyaránt 2 bájtos utasítások. A hurok is kevésbé hatékony, mint amilyen lehetne. Az első test ah,ah jobb lenne, mint a and. Másodszor, elrendezheti úgy, hogy a shr által beállított ZF-en elágazik. (pl. adc al,0 / shr ah / jnz _loop / adc al,0. Az első iterációnál a adc al,0 no-op, mert a xor al,al törölte a CF-et. A ciklusból való kilépés után hozzáadja az utolsó bit CF-jét. 15.09.2017
  • Tekintse meg az agner.org/optimize webhelyet és más x86 teljesítményre vonatkozó linkeket a x86 tag wiki 15.09.2017
  • @Mike: azt állítod, hogy a shr al 1 utasítás bájt (ami gyorsabb lenne 8088-on). Ez 2 bájt, ugyanaz, mint a test al,1; Nincs speciális eset AL / AX no-modrm kódolás a műszakokhoz, csak más utasítások, amelyek ténylegesen azonnaliak, mint például a test. (A változószámú eltolás újdonság volt a 186-ban, és ezekre sem létezik rövid forma, de ha igen, az akkor is 2 bájt lenne.) 02.02.2021
  • Ezenkívül a paritás számítási meghatározása csak az, hogy a popcount páros vagy páratlan-e, nem pedig a tényleges összeg. Tehát test al,al / jp. Vagy az egész AX-re, xor al,ah / jp. Nincs szükség popszámláló ciklusra, hacsak nem akarja a teljes összeget, és nem áll rendelkezésére az popcnt utasítás. 02.02.2021

  • 4

    Megtaláltam a megoldást!

    Csak adja hozzá az "and al,00000001" szót a jp páros fölé

    assume cs:cseg,ds:dseg,ss:sseg
        cseg segment
        start:  
        mov ax, dseg
        mov ds, ax  
    
        mov ah, 01h ; Here, im adding a number
        int 21h 
    
    and al,00000001
    
        jp even
        jnp odd  
    
        even: 
        mov ah,09
        lea dx,par
        int 21h  
        jmp exit
        odd: 
        mov ah,09
        lea dx,odd1 
        int 21h   
        jmp salir
        salir:
        mov ax,4C00h
        int 21h
    
        cseg ends 
    
        dseg segment byte         
        even Db 'Even number$'
        odd11 Db 'Odd number$'
        dseg ends  
    
        sseg segment stack
        db 100h dup(?)
        sseg ends
    
    end start
    
    27.03.2015
  • 1 - 0000_0001 páratlan szám, paritás páratlan. 2 - 0000_0010 páros szám, páratlan paritás. 3 - 0000_0011 páratlan szám, páros paritás. Mit próbálsz valójában csinálni? 27.03.2015
  • Jobb: test al, 1 a and al,1 helyett. Ugyanaz az utasításhossz, de a modern CPU-kon makróbiztosítékolható a jcc-val. (Még jp is, bár egyetlen bit paritása ugyanaz, mint annak tesztelése, hogy nulla-e, ami könnyebben érthető és ugyanolyan gyors lenne, bár ez működik.) 15.09.2017

  • 5
  • Mit jelent ez, és miért hasznos válasz erre a kérdésre? A shr al,1 / rcl bl, 0 / loop bit-reverse AL-nek kell lennie? Nem; A nullával számolt rcl költséges no-op, és nem támogatott a 8086-on. A rcl bl, 1 működik a 8086-on, és megfelelő bit-visszacsatolási ciklust hoz létre. Mindenesetre csak egy többjegyű szám utolsó tizedesjegyét kell megnéznie, hogy eldöntse, páratlan vagy páratlan, tehát túlbonyolítja ezt (bármi is legyen ez...) 15.09.2017
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..