我必须在程序集中创建一个程序,将用户的输入作为最大数组大小,然后让用户创建该大小的数组。 我应该将该值缓冲到最多1000个数组项(所有整数) 然后我必须对数组和输出运行选择排序。
我在IBM网站上找到了以下选择排序。
.section .data
array:
.byte 89, 10, 67, 1, 4, 27, 12, 34, 86, 3
array_end:
.equ ARRAY_SIZE, array_end - array
array_fmt:
.asciz " %d"
usort_str:
.asciz "unsorted array:"
sort_str:
.asciz "sorted array:"
newline:
.asciz "\n"
.section .text
.globl main
main:
pushl $usort_str
call puts
addl $4, %esp
pushl $ARRAY_SIZE
pushl $array
pushl $array_fmt
call print_array10
addl $12, %esp
pushl $ARRAY_SIZE
pushl $array
call sort_routine20
# Adjust the stack pointer
addl $8, %esp
pushl $sort_str
call puts
addl $4, %esp
pushl $ARRAY_SIZE
pushl $array
pushl $array_fmt
call print_array10
addl $12, %esp
jmp _exit
print_array10:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %edx
movl 12(%ebp), %ebx
movl 16(%ebp), %ecx
movl $0, %esi
push_loop:
movl %ecx, -4(%ebp)
movl 8(%ebp), %edx
xorl %eax, %eax
movb (%ebx, %esi, 1), %al
pushl %eax
pushl %edx
call printf
addl $8, %esp
movl -4(%ebp), %ecx
incl %esi
loop push_loop
pushl $newline
call printf
addl $4, %esp
movl %ebp, %esp
popl %ebp
ret
sort_routine20:
pushl %ebp
movl %esp, %ebp
# Allocate a word of space in stack
subl $4, %esp
# Get the address of the array
movl 8(%ebp), %ebx
# Store array size
movl 12(%ebp), %ecx
decl %ecx
# Prepare for outer loop here
xorl %esi, %esi
outer_loop:
# This stores the min index
movl %esi, -4(%ebp)
movl %esi, %edi
incl %edi
inner_loop:
cmpl $ARRAY_SIZE, %edi
jge swap_vars
xorb %al, %al
movl -4(%ebp), %edx
movb (%ebx, %edx, 1), %al
cmpb %al, (%ebx, %edi, 1)
jge check_next
movl %edi, -4(%ebp)
check_next:
incl %edi
jmp inner_loop
swap_vars:
movl -4(%ebp), %edi
movb (%ebx, %edi, 1), %dl
movb (%ebx, %esi, 1), %al
movb %dl, (%ebx, %esi, 1)
movb %al, (%ebx, %edi, 1)
incl %esi
loop outer_loop
movl %ebp, %esp
popl %ebp
ret
exit:
movl $1, %eax
movl 0, %ebx
int $0x80
我已经完成了它,我可以理解正在发生的事情的90%,所以我很高兴。 我不知道从哪里开始是如何获取用户输入并使用它创建数组?如何使用缓冲区设置数组大小的限制? 非常感谢任何帮助!
答案 0 :(得分:1)
此程序不是交互式的。 “输入”在行数组
中给出array:
.byte 89, 10, 67, 1, 4, 27, 12, 34, 86, 3
并且只能在编译期间进行更改。如果需要接受用户输入,则需要调用相应的内核函数或标准库函数。
带有stdin文件描述符的http://linux.die.net/man/2/read(非常低级别,但您正在编写汇编程序)或http://www.manpagez.com/man/3/scanf/(C函数)。 您还可以在命令行中获得“man scanf”的概述。
在堆栈上以相反顺序放置要赋予函数的参数,调用函数,然后重新调整堆栈。如何赋予函数参数取决于体系结构和操作系统。它在应用程序二进制接口(“ABI”)中定义。假设您使用的是i386,请参阅“函数调用序列”下的http://www.scribd.com/doc/48244725/abi386-4。
您可以使用
在.bss部分保留1000个字节.section .bss
buffer: .space 1000
或者您可以使用“malloc”。