0

x86-64 でダブル ワード配列をスキャンして保存しようとして困っています。私はすべてを見てきましたが、私が理解しているものは何も見つからないようです。私のプログラムは、dword 配列のすべての要素をスキャンして出力する必要があります。

多くの例を見てきましたが、それらを使用できないようです-コンパイルエラーが発生します。さらに、次のようなものを使用できないようです - 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が1回しか呼び出されないなど、いくつかの問題がありました。ret戻るものが何もないため、最後のディレクティブがセグメンテーション違反を引き起こしました。そして nasm syntax の行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 に答える