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