检查数字是奇数还是偶数(数学奇偶校验)

问题描述 投票:0回答:6

对于一位数,我想知道它是奇数还是偶数(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
assembly x86-16 parity
6个回答
7
投票

要测试一个数字是奇数还是偶数,检查该数字的第 0 位。如果设置了 bit0,则数字为奇数。没有别的。 不要混淆 PF(奇偶校验标志)和 JP/JNP 条件。奇偶校验标志显示最低有效字节中设置的位数是偶数还是奇数。

来自文档:

PF(位 2)奇偶校验标志 — 如果结果的最低有效字节包含偶数个 1 位,则设置; 否则清除。

数字 1 - 奇数,00000001b PF 被清除,因为只设置了一位
数字2 - 偶数,00000010b,但PF又被清除了!因为只设置了一位
数字 3 - 奇数,00000011b,但 PF 设置!因为设置了两个位


4
投票

虽然 Alexander Zhak 的回答指出了检查奇偶校验标志的代码中的缺陷,但以非破坏性方式检查 al 中数字奇偶校验的最快方法是:

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

3
投票

要测试一个数字是奇数还是偶数,只需将其右移一次并检查进位标志:

    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

0
投票

我找到了解决方案!

只需在 jp Even 上面添加“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

0
投票
  1. 开发汇编代码来验证给定的16位数字是否是5的倍数。如果是,则存储1 在名为“MULT5”的变量中;否则,将 0 存储在名为“NOTMULT5”的变量中。

-1
投票
    .MODEL SMALL
 .STACK 100H

 .DATA
   PROMPT_1  DB  'Enter a number: $'
   PROMPT_2  DB  0DH,0AH,'The given number in binary is: $'
   PROMPT_3  DB  0DH,0AH,'$' 
   MSG1 DB 10,13,’Number is Odd $’
   MSG2 DB 10,13,’Number is Even $’

 .CODE
   MAIN PROC
     MOV AX, @DATA                
     MOV DS, AX

     LEA DX, PROMPT_1                
     MOV AH, 9
     INT 21H

     XOR BL, BL                  
     MOV CX, 8                   
     MOV AH, 1                   

     @INPUT:                     
       INT 21H                   
       CMP AL, 0DH                
       JE @END                   
       AND AL, 0FH                
       SHL BL, 4                 
       OR BL, AL                  
     LOOP @INPUT                  

     @END:                        

     MOV AL, BL                   
     MOV CX, 8                    

     @LOOP:                       
       SHR AL, 1                  
       RCL BL, 0                  
     LOOP @LOOP                   

     LEA DX, PROMPT_2             
     MOV AH, 9
     INT 21H

     MOV CX, 8                    
     MOV AH, 2                    

     @OUTPUT:                     
       SHL BL, 1                  

       JNC @ZERO                  
         MOV DL, 31H              
         JMP @DISPLAY             

       @ZERO:                     
         MOV DL, 30H              

       @DISPLAY:                  
         INT 21H                  
     LOOP @OUTPUT                      



MOV AH,01H
INT 21H 

mov ah,01h


SAR AL,01h
JC ODD


LEA SI,MSG1
CALL PRINT

JMP TERMINATE

ODD:
LEA SI,MSG2
CALL PRINT


TERMINATE:
MOV AH,4CH
INT 21H

PRINT PROC
MOV DX,SI
MOV AH,09H
INT 21H




     MOV AH, 4CH                 
     INT 21H

 END MAIN
© www.soinside.com 2019 - 2024. All rights reserved.