【问题标题】:Scan array in x86 assemblyx86 程序集中的扫描阵列
【发布时间】:2013-11-05 01:00:09
【问题描述】:

我一直在尝试在 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”中的事实存储数组。 谢谢!

【问题讨论】:

  • 您使用的是什么汇编程序?除了 cmets 和指令之外,这看起来像 gas 语法。
  • 还有:为什么不直接用C写一个简单的程序,然后反汇编呢?
  • AMD x86-64。我也试过了。会再试一次。谢谢
  • 对不起,我在用煤气。 GNU。
  • 更好的是,gcc -S -m64 test.c 将产生汇编输出 test.s

标签: arrays assembly x86-64


【解决方案1】:

这似乎有效,但可能并不完全符合预期。您遇到了一些问题,包括您的最终 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多