- 不重复。计划目标是相同的,但需要采用不同的方式,这将在下面解释。这个问题有两个部分,如果我不完全按照需要做第一部分,那么我就不能做第二部分了.-
我需要编写一个C程序,然后根据C程序编写一个在功能上相同的汇编程序。我发现我的C程序:读取包含数字的用户输入,然后单个(')或双(")来表示英尺和英寸,并一直提示用户输入0,然后总结以英寸为单位输出所有条目并打印总长度,不适用于以下汇编函数:
void printStr(char *)
Arguments:
edi = address of null-terminated string to print
Returns:
Nothing
void printUInt(unsigned)
Arguments:
edi = Unsigned integer to print
Returns:
Nothing
char getchar()
Arguments:
None
Returns:
eax = the next character
uinsigned readUInt()
Arguments:
None
Returns:
eax = an unsigned int read from stdin.
(eax is 0 on error)
这是C程序:
#include <stdio.h>
#include <string.h>
int main(void)
{
char value[50];
char *end;
int sum = 0;
int conv;
do
{
printf("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\" when done): ");
fgets(value, 50, stdin);
conv = strtol(value, &end, 10);
if(strstr(value, "\'") != NULL)
{
conv = strtol(value, &end, 10);
sum = sum + (conv*12);
}
else if(strstr(value, "\"") != NULL)
{
conv = strtol(value, &end, 10);
sum = sum + conv;
}
}
while (conv != 0);
printf("Total: %d, %s\n", sum, "inches" );
return 0;
}
显然我不能将数字和引号分解成部分&#34;。我需要使用与上面列出的Assembly函数类似的函数。我不知道该使用什么,因为我觉得我已经尝试过类似的东西了。我被告知strtol()类似于readUInt(),我觉得这很好吗?无论如何,我不需要将字符串解析为stdin中的部分,而是需要将值中的值读入两个单独的部分&#34;。所以我想差异不是在一个部分读取然后解析,而是需要将输入读作两个不同的值。我怎么能用我现在拥有的东西做到这一点?请注意汇编功能可以执行的操作。当我去编写Assembly版本时,我必须能够使用这些函数代替C函数。
答案 0 :(得分:1)
鉴于您仅使用encrypted.o
中提供的功能的要求,您必须做出一些假设。 (1)encrypted.o
包含函数定义。 (2)它有一个你可以包含的头文件,所以你可以使用提供的功能。 (3)readUInt
在到达第一个非数字字符后将停止阅读并将其放回stdin
。
根据这些标准,并且仅使用提供的功能,您的代码将如下所示:
#include <stdio.h>
/* encrypted.h must contain declarations for the functions below, and
must contain all required headers beyond `stdio.h` required here */
#include "encrypted.h"
/* function prototypes */
void printStr(char *);
void printUInt(unsigned);
unsigned readUInt();
int main(void)
{
int c = 0; /* always initialize ALL variables */
unsigned measurement = 0;
unsigned sum = 0;
while (1)
{
printStr ("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\" when done): ");
/* read/validate measurement with readUInt() */
if ((measurement = readUInt()) == 0|| measurement == EOF) {
printStr ("notice: 0 read as measurement, or [CTRL+D] pressed, exiting.\n");
break;
}
/* read/validate unit with getchar() */
if (!(c = getchar()) || c == EOF) {
printStr ("error: 0 unable to read unit.\n");
/* empty the input buffer */
while ((c = getchar()) != '\n' && c != EOF);
/* get next input */
continue;
}
if ( c == '\'')
{
sum += measurement * 12; /* update sum as inches */
}
else if (c == '\"')
{
sum += measurement; /* update sum as feet */
}
else
printStr ("error: invalid or no unit read.\n");
/* empty the input buffer */
while ((c = getchar()) != '\n' && c != EOF);
}
/* print final result using only printStr & printUInt */
printStr ("\nTotal: ");
printUInt (sum);
printStr (" inches.\n\n");
return 0;
}
注意没有encrypted.o/encrypted.h
除了您之外没有其他人可以测试。编译类似于:
gcc -Wall -Wextra -c -o yourfile.o yourfile.c
链接类似于:
ld -o yourprog yourfile.o encrypted.o
如果您能提供encrypted.o
我们可以测试。
答案 1 :(得分:0)
#include <stdio.h>
int main(void)
{
int value;
int unit;
int sum =0;
do
{
printf("Enter a measurement and unit(Ex: 4' or 3\"; 0' or 0\" when done): ");
scanf("%d,%d", &value, &unit);
unit = getchar();
if(unit == '\'')
{
sum = sum + (value*12);
}
else if(unit == '\"')
{
sum = sum + value;
}
}
while (value != 0);
printf("Total: %d, %s\n", sum, "inches" );
return 0;
}