gpt4 book ai didi

linux - 在 AT&T 汇编中使用 stdin 和 stdout 连续读写

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:59 26 4
gpt4 key购买 nike

我有一个任务是用 AT&T Assembly 编写一个程序,只要你想要使用 Linux 的 stdinstdout 的字节序列,它就可以逐个部分地读写。

它应该是一个凯撒密码加扰器,只改变大的拉丁字符(A、B、C、D、…)向前一步(就像 A 到 B、B 到 C、C 到 D、…、Z 到 A ).

因此,就像程序读取序列的第一部分一样,执行更改字母的操作,而其他字符保持不变,将更改的部分写入标准输出,然后读取下一部分,然后一次又一次地执行所有操作。

最后它应该通过命令运行程序来处理设置为 stdin 和 stdout 的文件

>./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

最佳答案

这是该程序的一个版本,它消除了与使用固定大小的缓冲区相关的复杂性。

        .text
.global _start
_start:
# read(STDIN_FILENO, buf, 1)
movl $1, %edx # size_t nbyte
movl $buf, %ecx # void *buf
movl $0, %ebx # int filedes
movl $3, %eax # sys_read
int $0x80

cmp $1, %eax
jne bye # EOF or read() error

cmp $'A', (%ecx)
jl output # *buf < 'A'

cmp $'Z', (%ecx)
jg output # *buf > 'Z'
je z # *buf == 'Z'

incl (%ecx) # *buf >= 'A' && *buf < 'Z'
jmp output

z:
movl $'A', (%ecx)

output:
# write(STDOUT_FILENO, buf, 1)
movl $1, %ebx # int filedes
movl $4, %eax # sys_write
int $0x80
jmp _start

bye:
# exit(0)
movl $0, %ebx # int status
movl $1, %eax # sys_exit
int $0x80

.data
buf:
.byte 0

sample 运行

$ gcc -nostdlib -m32 caesar.S -o caesar
$ ./caesar
1234
1234
ABC1
BCD1
Z12BB
A12CC

使用 gdb 运行示例,一次一条指令。

gdb caesar

关于linux - 在 AT&T 汇编中使用 stdin 和 stdout 连续读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com