我一直在讀「彙編語言:一個簡明的介紹」有一段時間了,並有一個鍛鍊的問題,關於以下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經過一些測試後,唯一缺失的元素是最終換行符,但我最終會添加它。
要確定等價性,請設計一些可以在C程序上運行的測試,然後在ASM程序中比較結果。基於這個C程序的外觀,它應該是非常簡單的。在這種情況下,最有利於您的「高級」功能是「INVOKE」。沒有它,你需要知道你正在調用的例程的參數/堆棧約定並明確提供它們。 – lurker