Linux (AT&;T Debian 32位操作系统)如何将值列表反转为汇编中的另一个变量
因此,本(学校)作业的目标是获取一个16个单词的输入文件,其大小不超过16个字符(包括a\n),颠倒顺序,并将其输出到一个新文件中。输入文件的内容如下所示 input.txt: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
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或SSE1movaps
,或者根本不想使用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或SSE1movaps
,或者根本不想使用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,但您不必使用它。