0

我一直在阅读“汇编语言:简明介绍”有一段时间了,有一个练习题,关于以下 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

0

该程序唯一可能的优化是针对大小。优化速度是没有意义的,因为没有迭代。程序太简单了。所以,试着让它变小。尽管这也不是那么简单,因为程序很简单。但是您可以尝试优化字符串常量 - 例如定义了 4 次“电压”字符串。

于 2013-07-14T19:56:59.880 回答