我必须用数字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
答案 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中编写这个程序,仔细测试,让编译器将其转换为汇编程序,然后查看生成的代码。
顺便说一句,在汇编语言中,通常会编写注释,以便它们都在同一列中开始。