在 AT&T 汇编中使用 stdin 和 stdout 连续读写
Continuous reading & writing using stdin and stdout in AT&T assembly
我的任务是在 AT&T Assembly 中编写一个程序,只要你想要使用 Linux 的 stdin
和 [=13= 的字节序列,它就可以逐个部分地读写].
它应该是一个只改变大拉丁字符(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 [=11=], %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 , %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 , %edx # size_t nbyte
movl $buf, %ecx # void *buf
movl [=10=], %ebx # int filedes
movl , %eax # sys_read
int [=10=]x80
cmp , %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 , %ebx # int filedes
movl , %eax # sys_write
int [=10=]x80
jmp _start
bye:
# exit(0)
movl [=10=], %ebx # int status
movl , %eax # sys_exit
int [=10=]x80
.data
buf:
.byte 0
样本运行
$ gcc -nostdlib -m32 caesar.S -o caesar
$ ./caesar
1234
1234
ABC1
BCD1
Z12BB
A12CC
示例 运行 使用 gdb,一次一条指令。
我的任务是在 AT&T Assembly 中编写一个程序,只要你想要使用 Linux 的 stdin
和 [=13= 的字节序列,它就可以逐个部分地读写].
它应该是一个只改变大拉丁字符(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 [=11=], %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 , %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 , %edx # size_t nbyte
movl $buf, %ecx # void *buf
movl [=10=], %ebx # int filedes
movl , %eax # sys_read
int [=10=]x80
cmp , %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 , %ebx # int filedes
movl , %eax # sys_write
int [=10=]x80
jmp _start
bye:
# exit(0)
movl [=10=], %ebx # int status
movl , %eax # sys_exit
int [=10=]x80
.data
buf:
.byte 0
样本运行
$ gcc -nostdlib -m32 caesar.S -o caesar
$ ./caesar
1234
1234
ABC1
BCD1
Z12BB
A12CC
示例 运行 使用 gdb,一次一条指令。