2013-07-14 85 views
0

我一直在讀「彙編語言:一個簡明的介紹」有一段時間了,並有一個鍛鍊的問題,關於以下C程序的轉換C到MASM轉換

#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

要確定等價性,請設計一些可以在C程序上運行的測試,然後在ASM程序中比較結果。基於這個C程序的外觀,它應該是非常簡單的。在這種情況下,最有利於您的「高級」功能是「INVOKE」。沒有它,你需要知道你正在調用的例程的參數/堆棧約定並明確提供它們。 – lurker

回答

0

該程序唯一可能的優化是針對大小。爲了優化速度是沒有意義的,因爲沒有迭代。該計劃太簡單了。所以,儘量讓它變小。雖然這不是那麼簡單,因爲程序很簡單。但是您可以嘗試優化字符串常量 - 例如,定義了4次「電壓」字符串。

+0

感謝您的反饋,JohnFound。是的,我可能會減少電壓的發生次數。 – TheSOFan