【问题标题】:Converting a C program to inline Assembly?将 C 程序转换为内联汇编?
【发布时间】: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/…

标签: c assembly inline


【解决方案1】:

谢谢你们!发现内联是不必要的,我们应该进行常规组装!真的很感谢帮助!

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2021-02-26
    • 2016-10-07
    • 1970-01-01
    • 2021-08-16
    • 2017-08-31
    相关资源
    最近更新 更多