0

「Assembly Language: A Concise Introduction」をしばらく読んでいて、次の C プログラムの変換に関する演習問題があります。

#include <stdio.h>


int main ()  
{
    int voltage;   

    printf("%s", "Enter an AC Voltage: ");
    scanf("%d", &voltage);

    if (voltage >= 110 && voltage <= 120)
        printf("\n%s\n", "Voltage is Acceptable");

    else 
    {
        printf("\n%s\n","Warning!");

        if (voltage < 110)
            printf("%s\n","Voltage too Low"); 
        else
            printf("%s\n","Voltage too High");
    }

    printf("\n");
    return 0;
}

これが私のこれまでの努力です

    .386

.MODEL flat, c

printf PROTO arg1:Ptr BYTE, printlist:VARARG
scanf  PROTO arg2:Ptr BYTE, inputlist:VARARG

.DATA
    msgfmt1 BYTE "%s", 0
    msgfmt2 BYTE "%d", 0
    msgfmt3 BYTE "%c", 0
    msgfmt4 BYTE 0Ah, "%s", 0Ah, 0
    msgfmt5 BYTE "%s", 0Ah, 0

    msg1 BYTE "Enter an AC Voltage: ", 0
    msg2 BYTE "Voltage is Acceptable", 0
    msg3 BYTE "Warning!", 0
    msg4 BYTE "Voltage too Low!", 0
    msg5 BYTE "Voltage too High!", 0

    nl EQU 0Ah

    voltage SWORD ?

.CODE
    _Prog PROC  
        INVOKE printf, ADDR msgfmt1, ADDR msg1 
        INVOKE scanf, ADDR msgfmt2, ADDR voltage 

        if01: 
            CMP voltage, 110
            JL else01 
            CMP voltage, 120
            JG else01
            INVOKE printf, ADDR msgfmt4, ADDR msg2
            JMP endif01

        else01: 
             INVOKE printf, ADDR msgfmt4, ADDR msg3 

             if02: 
                 CMP voltage, 110
                 JGE else02
                 INVOKE printf, ADDR msgfmt5, ADDR msg4
                 JMP endif02     
             else02: 
                 INVOKE printf, ADDR msgfmt5, ADDR msg5
                 JMP endif02            
        endif02: 
        endif01: 
        RET
    _Prog ENDP
END

では、質問したいのですが、上記の MASM プログラムは C に相当するものを正しく実装していますか? もしそうなら、どのような最適化が利用可能ですか? 最後に、一部のアセンブリ フレーバーが提供する高レベルの機能 (.if ディレクティブや .else ディレクティブなど) を使用しないことの意味は何ですか?

PS AFAIU、いくつかのテストの後、欠けている要素は最後の改行だけですが、最終的には追加します。

4

1 に答える 1