0

我一直试图在 x86-64 中扫描和存储双字数组。我翻遍了所有地方,似乎找不到任何我能理解的东西。我的程序应该扫描并打印一个双字数组的所有元素。

我看过很多例子,但我似乎无法使用它们——它们给了我编译错误。此外,我似乎无法使用 - movq %rsi, [array + 8]

这是我的代码:

.data
.comm   arr, 800                # int arr[100];
.comm   p, 8                    # int pointer;
.comm   c, 8
.comm   c2, 8
.comm   c3, 8
arr     dd 100 DUP(0)
.text
format1:
        .string "Enter integers followed by EOF\n"

format2:
        .string "%ld"

format3:
        .string "a is %ld\n"

.globl main
main:                                   # main()
        movq    $format1, %rdi          #   printf("Enter integers followed by E
        movq    $0, %rax                #
        call    printf                  #
        movq    $arr, %r8
        movq    $0, c
        movq    $0, c2

        whileloop:
        movq    $format2, %rdi          #   scanf("%ld",&a);
        movq    $p, %rsi                #
        movq    %rsi, %r8
        movq    $0, %rax                #
        call    scanf                   #
        cmpq    $0, %rsi                #   if(arr[ptr] == 0)
        je      endwhileloop
        addq    $8, %r8
        addq    $1, c
        jmp     whileloop
        endwhileloop:
        movq    $format3, %rdi #   printf("a=%ld",a);
        movq    $p,%rsi       #
        movq    (%rsi),%rsi    #
        movq    $0, %rax       #
        call    printf         #
        ret

对于“arr”中的事实,这没有正确存储数组。谢谢!

4

1 回答 1

0

这似乎有效,也许并不完全符合预期。您遇到了一些问题,包括您的最终 printf 仅被调用一次;最后的ret指令导致段错误,因为没有什么可以返回;和 nasm 语法中的行arr dd 100 dup(0)

这是更正的汇编语言:

.data
.comm   arr, 800                # int arr[100];
.comm   p, 8                    # int pointer;
.comm   c, 8
.comm   c2, 8
.comm   c3, 8
.text
format1:
        .string "Enter integers followed by EOF\n"

format2:
        .string "%ld"

format3:
        .string "a is %ld\n"

.globl _start
_start:                                 # main()
        movq    $format1, %rdi          #   printf("Enter integers followed by E
        movq    $0, %rax                #
        call    printf                  #
        movq    $arr, %r8
        movq    $0, c
        movq    $0, c2

whileloop:
        movq    $format2, %rdi          #   scanf("%ld",&a);
        movq    $p, %rsi                #
        movq    %rsi, %r8
        movq    $0, %rax                #
        call    scanf                   #
        cmpq    $0, %rsi                #   if(arr[ptr] == 0)
        je      endwhileloop
        addq    $8, %r8
        addq    $1, c
        movq    $format3, %rdi #   printf("a=%ld",a);
        movq    $p,%rsi       #
        movq    (%rsi),%rsi    #
        movq    $0, %rax       #
        call    printf         #
        jmp     whileloop
endwhileloop:
        xor     %rbx, %rbx
        call    exit

以及我的 32 位 Debian 系统的 Makefile:

all: test
%.o: %.as
    as -o $@ --64 $<
%: %.o
    ld -melf_x86_64 -o $@ -lc \
     -dynamic-linker /lib64/ld-linux-x86-64.so.2 \
     $<

输出:

jcomeau@aspire:~/stackoverflow/19780206$ ./test
Enter integers followed by EOF
1234 5667 67899
a is 1234
a is 5667
a is 67899
^D
于 2013-11-05T09:43:10.877 回答