对于一位数,我想知道它是奇数还是偶数(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
要测试一个数字是奇数还是偶数,检查该数字的第 0 位。如果设置了 bit0,则数字为奇数。没有别的。 不要混淆 PF(奇偶校验标志)和 JP/JNP 条件。奇偶校验标志显示最低有效字节中设置的位数是偶数还是奇数。
来自文档:
PF(位 2)奇偶校验标志 — 如果结果的最低有效字节包含偶数个 1 位,则设置; 否则清除。
数字 1 - 奇数,00000001b PF 被清除,因为只设置了一位
数字2 - 偶数,00000010b,但PF又被清除了!因为只设置了一位
数字 3 - 奇数,00000011b,但 PF 设置!因为设置了两个位
虽然 Alexander Zhak 的回答指出了检查奇偶校验标志的代码中的缺陷,但以非破坏性方式检查 al 中数字奇偶校验的最快方法是:
test al,1
jz even
odd: ...
even: ...
要测试一个数字是奇数还是偶数,只需将其右移一次并检查进位标志:
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
我找到了解决方案!
只需在 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
.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