Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 检查数字是否可以被2整除,如果可以,则打印数字_Assembly_X86_Dos - Fatal编程技术网

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

Assembly 检查数字是否可以被2整除,如果可以,则打印数字,assembly,x86,dos,Assembly,X86,Dos,下面是我的ASM代码: 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

下面是我的ASM代码:

    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
我试图实现的是,在我将“60”写入键盘并按enter键后,我得到了错误的输出。我想得到数字“30”,因为60/2=30。 如果我输入42,我想得到21作为输出

知道我的代码为什么会失败吗

以下是完整的代码:

.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

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

所以


将检查AX是否可被2除最简单的方法是将单个位的值右移
位移位将存储在进位标志中

所以


将检查AX是否可被2整除测试偶数的最有效方法是测试低位:

test    AL,1
jz   isEven
这是非破坏性的,将宏融合到单个测试中,并在现代CPU上分支uop

在这种情况下,如果希望将结果除以2以便打印,那么移位是一种很好的方法。看看汤米的答案


按一移位可将一位移出
CF
:例如,在整数位上循环。

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

test    AL,1
jz   isEven
这是非破坏性的,将宏融合到单个测试中,并在现代CPU上分支uop

在这种情况下,如果希望将结果除以2以便打印,那么移位是一种很好的方法。看看汤米的答案


还有其他使用情况可以通过移位1将位移出
CF
:例如,循环整数中的位。

Tommy但是如何打印30?如果60/2=30。这种语言允许我一次打印一个字符。所以我把30除以10,把3存储到AL,把0存储到AH。但还是不行。我不想使用进位标志,因为我考虑了逻辑,如果它可以被2整除。我只想处理打印问题。请检查其他问题;)汤米,但是我怎么能打印30?如果60/2=30。这种语言允许我一次打印一个字符。所以我把30除以10,把3存储到AL,把0存储到AH。但还是不行。我不想使用进位标志,因为我考虑了逻辑,如果它可以被2整除。我只想处理打印问题。请检查其他问题;)