【发布时间】:2018-03-29 20:45:41
【问题描述】:
我正在尝试将以下 C 程序转换为内联汇编:
#include <stdio.h>
#include <string.h>
int main()
{
int counter = 0;
int input = 0;
char name[20];
printf("Please input an integer value 1 - 99: ");
scanf("%d", &input);
printf("You entered: %d\n", input);
if (input <= 0)
{
printf("Error, invalid input \n");
}
if (input > 0)
{
printf("Please input name \n");
scanf("%s", name);
for (int i = 1; i <=input; i++)
{
printf("Your name is %s\n", name);
printf("%d\n", i);
}
}
return 0;
}
这是我对内联的尝试:
.LC0:
.string "please input an interger value 1-99"
.LC1:
.string "%d"
.LC2:
.string "you entered %d"
.LC3:
.string "Error invalid input"
.LC4:
.string "please input name"
.LC5:
.string "%s"
.LC6:
.string "Your name is %s"
main:
push rbp
mov rbp, rsp
sub rsp, 32
mov DWORD PTR [rbp-8], 0
mov DWORD PTR [rbp-12], 0
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
lea rax, [rbp-12]
mov rsi, rax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call scanf
mov eax, DWORD PTR [rbp-12]
mov esi, eax
mov edi, OFFSET FLAT:.LC2
mov eax, 0
call printf
mov eax, DWORD PTR [rbp-12]
test eax, eax
jg .L2
mov edi, OFFSET FLAT:.LC3
mov eax, 0
call printf
.L2:
mov eax, DWORD PTR [rbp-12]
test eax, eax
jle .L3
mov edi, OFFSET FLAT:.LC4
mov eax, 0
call printf
lea rax, [rbp-32]
mov rsi, rax
mov edi, OFFSET FLAT:.LC5
mov eax, 0
call scanf
mov DWORD PTR [rbp-4], 1
jmp .L4
.L5:
lea rax, [rbp-32]
mov rsi, rax
mov edi, OFFSET FLAT:.LC6
mov eax, 0
call printf
mov eax, DWORD PTR [rbp-4]
mov esi, eax
mov edi, OFFSET FLAT:.LC1
mov eax, 0
call printf
add DWORD PTR [rbp-4], 1
.L4:
mov eax, DWORD PTR [rbp-12]
cmp DWORD PTR [rbp-4], eax
jle .L5
.L3:
mov eax, 0
leave
ret
所以我想我的问题是,我在正确的轨道上吗?我觉得这些东西非常令人困惑。我的教练所说的只是“我在正确的轨道上”并没有帮助,所以任何帮助都将不胜感激! (每当我运行它时,我都会在第一行抱怨“。”)
【问题讨论】:
-
当您谈论 Stack Overflow 上的错误时,请请在您的问题中包含错误的确切文本。不要让我们猜测。指出您正在使用的汇编程序也很有帮助,这样我们就可以尝试重现问题,以及在汇编时指定您要针对的特定 ISA 和操作系统。
-
明确地说,你所拥有的不是 inline 程序集。 Inline assembly 只是 C 函数中的几行(通常)汇编。你所拥有的是一个用汇编语言编写的程序。如果您尝试使用 C 编译器进行编译,那么是的,C 编译器首先要抱怨的是“。”
-
@user3386109 如果它的语法与 C 编译器使用的汇编器相同,则 可以 说:
cc -c foo.s。.Lx标签(例如.L3)强烈表明.s文件是从cc -S foo.c生成的 -
@CraigEstey 这可能是 OP 正在寻找的答案:文件名需要以
.s结尾,而不是.c -
如果您想要不糟糕的 asm,请使用
gcc -S -masm=intel -Os foo.c。 (-Os优化大小,而不是制作嘈杂/笨拙的未优化代码)。当然,这几乎都只是函数调用,所以这里就不多说了。它只是看起来像一个巨大的混乱,因为您将它加倍并破坏了编译器使用的缩进。相关:stackoverflow.com/questions/38552116/…