【发布时间】:2017-03-10 20:09:10
【问题描述】:
我有一个任务是在 AT&T Assembly 中编写一个程序,只要你想要使用 Linux 的 stdin 和 stdout 的字节序列,它就可以逐个读写。
它应该是一个凯撒密码扰码器,只将大的拉丁字符(A,B,C,D,...)向前一步(就像 A 到 B,B 到 C,C 到 D,...,Z 到 A )。
因此,就像程序读取序列的第一部分,执行操作以更改字母而其他字符保持不变,将更改的部分写入标准输出,然后读取下一部分,然后一次又一次地做所有事情。
最后它应该通过命令运行程序来处理设置为标准输入和标准输出的文件
>./executable >output.txt < input.txt
我现在能够编写的是读取一些字符、执行操作、打印输出并要求更多的程序。但是,如果您在输入中输入的字符多于 buf 大小,则会崩溃。
代码如下:
SYSCALL32 = 0x80
EXIT = 1
ERR_CODE = 0
STDIN = 0
READ = 3
STDOUT = 1
WRITE = 4
BUF_SIZE = 80
.data
textin: .space BUF_SIZE
textout: .space BUF_SIZE
.global _start
_start:
mov $READ, %eax
mov $STDIN, %ebx
mov $textin, %ecx
mov $BUF_SIZE, %edx
int $SYSCALL32 # reading 80 characters (buf_size) of std input
cmp $0, %eax
je exit #if 0 characters read exit
xorl %esi, %esi #clering iterator for loop
loop:
mov textin(%esi), %al #copying 1 character from textin buf to work with
cmp $'\n', %al
je out
cmp $'A', %al
jl skip
cmp $'Z', %al
jg skip
je takeCareOfZ
add $1, %al
jmp skip
takeCareOfZ:
mov $'A', %al
skip:
movb %al, textout(%esi)
incl %esi
jmp petla
out:
mov $WRITE, %eax
mov $STDOUT, %ebx
mov $textout, %ecx
mov $BUF_SIZE, %edx
int $SYSCALL32 #writing 80 characters to std output
jmp _start
exit:
mov $EXIT, %eax
mov $ERR_CODE, %ebx
int $SYSCALL32
【问题讨论】:
标签: linux assembly stdout stdin att