Linux (AT&;T Debian 32位操作系统)如何将值列表反转为汇编中的另一个变量

Linux (AT&;T Debian 32位操作系统)如何将值列表反转为汇编中的另一个变量,linux,assembly,x86,gnu-assembler,att,Linux,Assembly,X86,Gnu Assembler,Att,因此,本(学校)作业的目标是获取一个16个单词的输入文件,其大小不超过16个字符(包括a\n),颠倒顺序,并将其输出到一个新文件中。输入文件的内容如下所示 input.txt: 1. First....... 2. Second...... 3. Third....... 4. Fourth...... 5. Fifth....... 6. Sixth....... 7. Seventh..... 8. Eighth...... 9. Ninth....... 10. Tenth...... 1

因此,本(学校)作业的目标是获取一个16个单词的输入文件,其大小不超过16个字符(包括a\n),颠倒顺序,并将其输出到一个新文件中。输入文件的内容如下所示

input.txt:

1. First.......
2. Second......
3. Third.......
4. Fourth......
5. Fifth.......
6. Sixth.......
7. Seventh.....
8. Eighth......
9. Ninth.......
10. Tenth......
11. Eleventh...
12. Twelfth....
13. Thirteenth.
14. Fourteenth.
15. Fifteenth..
16. Sixteenth..
到目前为止,我已设法接收输入文件并将其分配给变量。我已经用临时打印语句(在下面的代码中注释)验证了这一点。但是,当我将其转换为输出变量时(在将所述变量写入新文件之前),它就不起作用了

下面是我当前的代码,运行后得到的结果如下。我已经在这方面工作了好几个小时了,但令人沮丧的是,关于这个特殊的汇编语法的信息太少了,所以任何明确的帮助都将不胜感激。请注意——我在这里是一个新手,所以我可能不理解可能被认为是基本的汇编术语或概念。请跟我说

我的代码:

.section .data

InFileName:
      .asciz   "input.txt"
InFileHandle:
      .int     0
OutFileName:
      .asciz   "output.txt"
OutFileHandle:
      .int     0
Output:
      .fill    256

.section .bss

Input:
      .fill    256

.section .text
.globl _start

_start:
      movl     $5, %eax               # Open file
      movl     $InFileName, %ebx
      movl     $02, %ecx
      movl     $0777, %edx
      int      $0x80

      test     %eax, %eax             # Check for file error
      js       Error

      movl     %eax, InFileHandle     # Puts Input file handle into variable

      movl     $3, %eax               # Writes file to variable
      movl     InFileHandle, %ebx
      movl     $Input, %ecx
      movl     $InputLen, %edx
      int      $0x80

#     call     PrintVariable          # Temporary call for testing
      call     Reverse

PrintVariable:
      movl     $4, %eax
      movl     $1, %ebx
      int      $0x80
      ret

Error:
      call     ExitProg

Reverse:
      movl     $Input, %esi           # Move %esi to Input
      movl     $(Output+240), %edi    # Move %edi to end of Output
      cld                             # Clear direction flag
      movl     $16, %ecx              # Move input length to %ecx
      subl     $32, %edi              # Subtract twice input length from %edi
      rep      movsb                  # Repeat until %ecx is 0

      movl     $Output, %ecx          # Assign output for printing
      movl     $256, %edx

      call     PrintVariable          # Printing value for testing purposes

ExitProg:
      movl     $1, %eax
      movl     $0, %ebx
      int      $0x80
运行此代码后的输出:

1. First.......

我不知道我在这里哪里出了问题,所以任何帮助都将不胜感激。解决这个问题(将输入的数据转换为新变量)后,我需要将该数据推送到输出文件中。我相信我自己能弄清楚这一部分,但我也不会说不来帮忙。

它们是否真的被填充到了16字节的固定宽度元素,就像你用
填充显示的那样?这使得它非常简单,无需解析,就像反转
int
数组一样,但使用16字节
movdqa mem,%xmm0
加载/存储。@PeterCordes我甚至不知道最后一句话是什么意思。是的,它们被填充到固定长度16。是一条16字节的加载指令,输入XMM寄存器。或者,如果您不想要求SSE2或SSE1
movaps
,或者根本不想使用XMM寄存器,您也可以分别复制这4个DWORD。@PeterCords我想您可能指的是不同的语法。我从没听说过德沃德。至于SSE2/SSE1,我正在使用一个简单的Debian 32位命令行操作系统来使用nano编写它。这就是我所有可用的/允许使用的。dword或双字不是AT&t语法的一部分,但这不是我的意思。在英特尔术语中,这就是描述4字节数据块的方式。无论您使用的是哪种asm语法,英特尔和/或AMD的手册都是了解ISA的最佳方式。
movl
上的
l
后缀表示双字,而
movw
表示16位“字”。(顺便说一句,这不是现代x86的“字号”。现代x86实际上没有字号;不同的东西有不同的大小。)无论如何,自1998年奔腾III以来,所有x86 CPU上都可以使用32位模式的SSE,但您不必使用它。它们是否真的被填充为16字节的固定宽度元素,就像您在
填充中显示的那样?这使得它非常简单,无需解析,就像反转
int
数组一样,但使用16字节
movdqa mem,%xmm0
加载/存储。@PeterCordes我甚至不知道最后一句话是什么意思。是的,它们被填充到固定长度16。是一条16字节的加载指令,输入XMM寄存器。或者,如果您不想要求SSE2或SSE1
movaps
,或者根本不想使用XMM寄存器,您也可以分别复制这4个DWORD。@PeterCords我想您可能指的是不同的语法。我从没听说过德沃德。至于SSE2/SSE1,我正在使用一个简单的Debian 32位命令行操作系统来使用nano编写它。这就是我所有可用的/允许使用的。dword或双字不是AT&t语法的一部分,但这不是我的意思。在英特尔术语中,这就是描述4字节数据块的方式。无论您使用的是哪种asm语法,英特尔和/或AMD的手册都是了解ISA的最佳方式。
movl
上的
l
后缀表示双字,而
movw
表示16位“字”。(顺便说一句,这不是现代x86的“字号”。现代x86实际上没有字号;不同的东西有不同的大小。)总之,自1998年奔腾III以来,所有x86 CPU上都可以使用32位模式的SSE,但您不必使用它。