2014-12-05 2 views
0
.386 
    .MODEL FLAT 
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD 
Include io.h 
cr  equ 0DH 
Lf  equ 0AH 

     .STACK 4096 
     .DATA 

string byte 40 Dup (?) 
number dword ? 

runningSum dword 0 

rejected byte " , Rejected", 0 
positive byte cr, Lf, "Positive",0 
negative byte cr, Lf, "Negative",0 

numaschar byte 11 dup(?),0 
newline byte cr,Lf,0 

    .code 
_start: 

forever: input string, 40 
     atod string 
     mov number, eax 
     cmp number,0 
     jne processing 
     je finish 

processing: 
    cmp number,10 
     jg message 

    cmp number,-10 
     jl message 

    cmp number,10 
     jle not_rejected1 

    cmp number,-10 
     jge not_rejected2 

    jmp jumpToTop 

message: dtoa numaschar,number 
     output numaschar 
     output rejected 
     output newline 

not_Rejected1: cmp number, -10 
       jge processing2 

not_Rejected2: cmp number,10 
       jle processing2 

processing2: cmp number, 0 
       jg addInstruct 
       jl subInstruct 


addInstruct: add ebx, 1 
      add edx,number 
      jmp message2 

subInstruct: add ecx, 1 
      jmp message3 

message2: dtoa numaschar, number 
      output positive 
      output newline 

message3: dtoa numaschar, number 
      output negative 
      output newline 


jumpToTop: jmp forever 


finish: 
    INVOKE ExitProcess, 0 

PUBLIC _start 
     END 

이 프로그램은 '긍정적'과 '부정적'모두 메시지를 인쇄하는 방법을 제공 양수에 읽어하지만 난 그게 "긍정적"MASM 어셈블리 점프 명령 인쇄 문제

에만 메시지를 인쇄해야 어떤 도움을 주셔서 감사합니다. 감사 !

.............................................. .................................................. .....

답변

0

레이블 message2 다음의 코드를 살펴보십시오. 거기에는 jmp 명령어가 없습니다. 결과적으로 "양수"를 인쇄 한 후 코드는 다음 케이스로 넘어지고 "음수"를 인쇄합니다.

forever 또는 finish으로 건너 뛰었습니다.

+0

여러 위치에서 점프하는 대신 하나의 위치에 배치해야하므로 어디에서 상위 문으로 점프 할 수 있습니까? 가능한가? –

+0

호출 명령어를 사용하면 jmp를 여러 번 사용하지 않아도됩니다. 백 점프는 ret 명령으로 만 수행 할 수 있습니다. –

+0

@AmberBexley - 코드를 자세히 살펴보면'messagemp3 '레이블 앞에'jmp jumpToTop'을 코드 행으로 추가 할 것입니다. 물론 점프가 필요한 위치로 점프를하고있는 중입니다. 코드가 단순히 영원히 뛰어 올랐다면 코드가 훨씬 더 효율적 이겠지 만 jmp와 jumpToTop 만 읽으면 더 쉽게 읽을 수 있습니다 (imho). 앞뒤로 뛰어든간에 위트콘 (van Witkon)의 의견을 참조하십시오. ** _message2'_ 레이블에 뒤 따르는 코드를 실행 한 후 필요합니다 ** 그리고 **는 ' message3' 라벨 _. – enhzflep

관련 문제