检查数字是否可被2整除,如果是,则打印该数字

时间:2016-03-25 22:11:53

标签: assembly x86 dos

嗯,这是我的ASM代码:

.MODEL SMALL
.STACK 100h
.DATA

DisplayString DB 'Enter number up to 120:', 13,10,'$'
isPrimeNum DB 'is prime', 13,10,'$'
    goodMSG DB 'good', 13,10,'$'
        badMSG DB 'bad', 13,10,'$'
divisionCalc DB ?
myNum DB ?
two DB 2
three DB 3
five DB 5
seven DB 7
ten DB 10
eleven DB 11

    .CODE
Begin:
    MOV AX,@DATA
    MOV DS,AX

    MOV AH,9
    MOV DX,OFFSET DisplayString
    INT 21h

    MOV BL,0 ; Initialize BL to zero!

    ; //READ 3 DIGITS // ;
    ;read first digit for e.g. '1'
    MOV ah,1h
    INT 21h ;read into AL
    SUB AL,30h ; Convert the digit from ASCII to DECIMAL
    MOV myNum,AL

    MOV AH,1
    INT 21h

    CMP AL,13 ;is it Enter?
    JE endInput
    SUB AL,'0' ;Not enter, let's save this new char
    MOV CL, AL ; we save the 2nd char to CL
    MOV AL, myNum ; lets move our first char to AL
    MUL Ten ; multiply by 10 the first char
    MOV myNum,AL ;move that to myNum
    ADD myNum,CL ; add to AL the 2nd char.

    MOV AH,1
    INT 21h

    CMP AL,13 ; is it enter?
    JE endInput
    SUB AL,'0' ;Not enter, let's save this new char
    MOV CL, AL ; we save the 2nd char to CL
    MOV AL, myNum ; lets move our first char to AL
    MUL Ten ; multiply by 10 the first char
    MOV myNum,AL ;move that to myNum
    ADD myNum,CL ; add to AL the 2nd char.

    mov AH,1 ; if the number is 3 chars then this will be the enter now. 
    int 21h 

    ; // FINISH READING 3 DIGITS // ;
    endInput:

            ; AL = AX / two
        ; AH = AX % two
MOV AH, 0 ;reset AH before division
MOV AL,myNum ;move the inputed number to AL
DIV two ;div 123 / 2;
CMP AH,0
JNE inputIsPrime

;If 123 % 2 = 0, output 123 / 2.
DIV ten
MOV DH,AH

SUB AL,'0'
MOV AH,2
MOV DL, AL
INT 21h

MOV divisionCalc,DH

MOV AH,2
MOV DL,DH
INT 21h
JMP endProg

inputIsPrime:
MOV AH,9
MOV DX,OFFSET isPrimeNum
INT 21h

endProg:
MOV AH,4Ch
INT 21h
END Begin

在我写完" 60"之后我想在这里实现的目标是什么?键盘并按回车键,输出错误。我想得到这个数字" 30"因为60/2 = 30。 如果我输入42,我想得到21作为输出。

我的代码失败的任何想法?

这里是完整的代码:

{{1}}

2 个答案:

答案 0 :(得分:4)

测试偶数的最有效方法是测试低位:

test    AL,1
jz   isEven

这是非破坏性的,并且会在现代CPU上宏观融合成一个测试和分支uop。

在这种情况下,如果您希望将除法结果设为2,那么您可以打印它,那么转换是一种好方法。见汤米的答案。

还有其他一些使用案例可以将一位移位到CF:例如循环遍历整数位。

答案 1 :(得分:2)

除以二的最简单方法是右移一个位的值 位shiftet将存储在进位标志

所以

shr AX,1
jnc isDividable    ; no carry set = there was no division "rest"

将检查AX是否可被2分割