2016-11-19 7 views
1

저는 어셈블리 언어의 초보자이며 솔루션을 빨리 찾아야합니다.
문제는 사람 (3 자리)에서 숫자를 읽고이를 정수로 변환하여 두 값과 비교해야한다는 것입니다.
문제는 비교를 변환 한 후 가끔 결과가 정확하지 않은 경우가 있다는 것입니다. 올바르게 입력을 해석하지 있기 때문에Masm 16 비트 Ascii에서 바이트로 변환

pile segment para stack 'pile' 
    db 256 dup (0) 
pile ends 

data segment 
ageper db 4,5 dup(0) 
bigg db 13,10,"bigger than 146 ",13,10,"$" 
lesss db 13,10,"less than 0 ",13,10,"$" 
right db 13,10,"correct number 123 ",13,10,"$" 
theint db 0 


exacnumber db 123 
data ends 

code segment 
main proc far 

    assume cs:code 
    assume ds:data 
    assume ss:pile 
    mov ax,data 
    mov ds,ax 

    mov ah,0ah 
    lea dx,ageper 
    int 21h 

    mov ch,0 
    cmp ageper[4],0 
    jz phase2 
    mov ah,ageper[4] 
    sub ah,48 
    add theint,ah 
    phase2: 
    mov cl,10 
    cmp ageper[3],0 
    jz phase3 
    mov ah,ageper[3] 
    sub ah,48 
    mov al,ah 
    mul cl 
    add theint,al 
    phase3: 
    mov cl,100 
    cmp ageper[2],0 
    jz phase4 
    mov ah,ageper[2] 
    sub ah,48 
    mov al,ah 
    mul cl 
    add theint,al 

    phase4: 
    cmp theint,123 
    je yes 
    cmp theint,130 
    jg big 
    cmp theint,0 
    jl less 
    jmp ending 


    big: 
    mov ah,09h 
    lea dx,bigg 
    int 21h 
    jmp ending 

    yes: 
    mov ah,09h 
    lea dx,right 
    int 21h 
    jmp ending 

    less: 
    mov ah,09h 
    lea dx,lesss 
    int 21h 


    ending: 
    mov ageper,20 
    mov ageper[1],20 

    mov ah,02 
    lea dx,theint 
    int 21h 

    mov ah,4ch 
    int 21h 
main endp 
code ends 
    end main 
+1

변환 된 정수를 보유하기 위해 바이트를 사용하고 있습니다. 부호없는 바이트는 0-255 범위의 값만 나타낼 수 있습니다. – Michael

+0

감사합니다 남자, 결국 바이트가 잘 작동하고 그것은 int 범위에 맞는 부호없는 입력을 읽을 필요가 –

답변

1
cmp ageper[4],0 
jz phase2 
... 
cmp ageper[3],0 
jz phase3 
... 
cmp ageper[2],0 
jz phase4 

여러분의 프로그램은 불규칙하게 수행!
DOS에서 수신 한 간단한 3 자리 입력은 사용자가했던 것처럼 숫자 0을 확인하지 않아도됩니다. 3 cmp 님과 jz 님의 사진을 삭제하십시오.


또 다른 작은 논리적 오류는 수보다 더 큰 130 때, 당신은보다 더 큰 146 인로보고 있다는 점이다.


mov ageper,20 
mov ageper[1],20 

이 명령은 아무 의미가 없습니다!

mov ah,02 
lea dx,theint 
int 21h 


다음은 올바른 DOS 기능의 사용에 혼란스러워. 함수 02h는 DL 레지스터를 사용하고, 함수 09h는 DX 레지스터를 사용합니다. 설명서에서 찾아보십시오. 아래와 같이

가 @Michael (256 999-3 자리수 다루는)에 의해보고 된 문제를 해결하기 위해 단어와 theint 변수를 정의하고에 추가

theint dw 0 

mov ch, 0 
mov cl, ageper[4] 
sub cl, 48 
mov theint, cx  <<< Use MOV the first time! 
phase2: 
mov cl, 10 
mov al, ageper[3] 
sub al, 48 
mul cl 
add theint, ax  <<< Add AX in stead of AH 
phase3: 
mov cl, 100 
mov al, ageper[2] 
sub al, 48 
mul cl 
add theint, ax  <<< Add AX in stead of AH 
+1

도움을 많이 주셔서 감사합니다! 문제는 서명되지 않은 theint의 값입니다. ** ja 대신 ** ja **로 전환했을 때 문제가 해결되었습니다. 또한 0으로 cmp를 제거한 다음 프로그램이 작동했습니다. 20은 테스트 중이었고 마침내 교수님은 우리에게 인터넷을 살펴달라고 요청한 설명서를주지 않으 셨습니다 ... 다른 문제에 도움이 필요할 수도 있습니다. 다시 도움을 청합니다. –