4

对于一位数,我想知道它是奇数还是偶数(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 (bit 2) Parity flag — 如果结果的最低有效字节包含偶数个 1,则设置;否则清除。

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

于 2015-03-27T10:32:15.513 回答
4

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

        test al,1
        jz even
odd:    ...
even:   ...
于 2015-03-30T13:59:12.877 回答
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
于 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 回答
-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
于 2017-09-15T07:55:34.587 回答