我一直在阅读“汇编语言:简明介绍”有一段时间了,有一个练习题,关于以下 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,经过一些测试,唯一缺少的元素是最后的换行符,但我最终会添加它。