如何在程序集中颠倒数组的顺序?

时间:2013-04-23 05:12:21

标签: assembly x86 intel

现在我的代码给了我1846倒退。我不知道如何反转数组打印输出1846而不是6481.我想我需要一个循环来反转它但我不知道如何实现它。任何帮助,将不胜感激。谢谢。

.data 

enter_message:
    .ascii "Enter a binary value:\n"

enter_message_length:
    .int 22

name:
    .space 50
buffersize:
    .int 0

someLength:
    .int 50
array:
    .space 50

.text
.global _start

_start:




mov  $1846, %eax

mov $10, %ebx
    mov $0, %edi 
While_Loop:
    cmp $0, %eax                        
    je Convert_to_ASCII                 

    mov $0, %edx                        
    div %ebx                            

    add $48, %edx               
    movb %dl, buffersize(%edi)      
    add $1, %edi
    jmp While_Loop      


Convert_to_ASCII: 
    mov $4, %eax
    mov $1, %ebx
    mov $buffersize, %ecx
    mov %edi, %edx
    int $0x80

mov $1, %eax
int $0x80

1 个答案:

答案 0 :(得分:1)

至少有两个实用/简单的选项

1)从专用于目标字符串的内存区域的末尾开始并递减指针(确保字符串以ascii零结尾)。

  mov ah,[bx];
  dec bx

2)使用堆栈 - 您需要将操作拆分为两个循环,每次N次迭代

  • 第一次循环:按N次
  • next loop:弹出N次并写入* bx ++

2.1)写入临时字符串(与堆栈相同的机制,但使用更少的空间和更复杂的指令)。

2.5)使用递归

3)由于这个问题基本上是关于十进制到ascii转换的,所以使用一个算法,该算法首先使用最大数量(这通常通过试验减法实现:)

int biggest = 10000;
while (biggest) {
  digit='0';
  while (number >= biggest) { number -=biggest; digit++; }
  output(digit);   // tune this to skip leading zeros
  biggest/=10;  // or read next from a table
}