如何在Assembly 80386中将值插入数组?

时间:2016-05-02 04:44:43

标签: assembly x86

我必须用数字1-5替换空的5整数数组xarr。代码编译,我相信它是正确的,除了最后一部分。我的输出现在是12345,这是我需要的。但是,我只应该在结束时使用一次打印功能,输出12345应该是垂直的(一次一个),而不是水平的。

.globl _asm_main


.section .data, ""

.section .bss, ""
xarr: .fill 5, 4, 0

.section .text, ""
_asm_main:
    enter   $0, $0      # set up stack frame
    pusha           # save registers

    movl $1, %edi
    movl %edi, xarr(, %edi, 4)
    movl xarr(, %edi, 4), %eax
    call print_int
    incl %edi
    movl %edi, xarr(, %edi, 4)
    movl xarr(, %edi, 4), %eax
    call print_int
    incl %edi
    movl %edi, xarr(, %edi, 4)
    movl xarr(, %edi, 4), %eax
    call print_int
    incl %edi
    movl %edi, xarr(, %edi, 4)
    movl xarr(, %edi, 4), %eax
    call print_int
    incl %edi
    movl %edi, xarr(, %edi, 4)
    movl xarr(, %edi, 4), %eax
    call print_int

    popa            # restore registers
    movl    $0, %eax    # return program status in eax
    leave           # restore stack frame
    ret

1 个答案:

答案 0 :(得分:0)

根据最后一条mov指令,它应该是:

movl from_where, to_where

这是因为无法从%eax移动到零。

因此,操作数与其他mov的顺序是错误的。

movl xarr(, %edi, 4), %eax     # read from the array
movl %edi, xarr(, %edi, 4)     # write into the array; note the %edi instead of the %eax

并注意每个寄存器在每个点包含的内容。您似乎没有初始化%eax,而是将其值写入数组。

你应该首先在C中编写这个程序,仔细测试,让编译器将其转换为汇编程序,然后查看生成的代码。

顺便说一句,在汇编语言中,通常会编写注释,以便它们都在同一列中开始。