「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、いくつかのテストの後、欠けている要素は最後の改行だけですが、最終的には追加します。