C-To-MASM转换

时间:2013-07-14 19:36:02

标签: assembly masm

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

1 个答案:

答案 0 :(得分:0)

此程序唯一可能的优化是尺寸。优化速度是没有意义的,因为没有迭代。该计划太简单了。所以,试着让它变小。虽然程序简单,但即便如此也不是那么简单。但您可以尝试优化字符串常量 - 例如,定义了4次“Voltage”字符串。