4

1桁の数字が奇数か偶数(2の倍数)か知りたいです。たとえば、与えられた 9 は奇数であると出力します。

(つまり、計算パリティではなく、数学パリティをチェックします。)

これは私が持っているものです:

   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
4

5 に答える 5

6

数値が奇数か偶数かをテストするには、この数値のビット 0 をチェックします。bit0 が設定されている場合、数値は奇数です。他には何もありません。PF (パリティフラグ) と JP/JNP 条件を混同しないでください。パリティ フラグは、最下位バイトに設定されたビット数が偶数か奇数かを示します。

ドキュメントから:

PF (ビット 2) パリティ フラグ — 結果の最下位バイトに 1 のビットが偶数個含まれている場合に設定されます。それ以外はクリア。

数値 1 - 奇数、00000001b ビット セットが 1 つしかないため、PF はクリアされます
数値 2 - 偶数、00000010b ですが、PF は再びクリアされます。ビット セット番号 3 が 1 つしかないため
- 奇数、00000011b、しかし PF セット! 2つのビットが設定されているため

于 2015-03-27T10:32:15.513 に答える
4

Alexander Zhak の回答では、パリティ フラグをチェックするコードの欠陥が指摘されていますが、非破壊的な方法で al の数値のパリティをチェックする最速の方法は次のとおりです。

        test al,1
        jz even
odd:    ...
even:   ...
于 2015-03-30T13:59:12.877 に答える
3

数値が奇数か偶数かをテストするには、数値を右に 1 回シフトし、キャリー フラグを確認します。

    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

キャリー フラグを理解することは、さまざまなコーディングのトリックに非常に役立ちます。たとえば、「パリティ」は数値の合計ビット数をカウントアップしており、同様のトリックを使用できます。

    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
于 2015-03-27T08:47:16.033 に答える
0

解決策を見つけました!

jpの上に「and al,00000001」を追加するだけです

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
于 2015-03-27T03:03:45.223 に答える