我一直在阅读“汇编语言:简明的介绍”一段时间,并且有一个关于以下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指令)的含义是什么?
P.S。 AFAIU,经过一些测试,唯一缺失的元素是最终换行,但我最终会添加它。
答案 0 :(得分:0)
此程序唯一可能的优化是尺寸。优化速度是没有意义的,因为没有迭代。该计划太简单了。所以,试着让它变小。虽然程序简单,但即便如此也不是那么简单。但您可以尝试优化字符串常量 - 例如,定义了4次“Voltage”字符串。