簡體   English   中英

在AT&T程序集中使用stdin和stdout進行連續讀寫

[英]Continuous reading & writing using stdin and stdout in AT&T assembly

我有一個任務要在AT&T匯編中編寫一個程序,只要您想要使用Linux的stdinstdout進行字節序列化,就可以部分地進行讀寫。

它應該是一個Caesar密碼加擾器,僅向前移動較大的拉丁字符(A,B,C,D等)(例如,從A到B,B到C,C到D,…,Z到A)。

因此,就像程序讀取序列的第一部分一樣,執行操作以更改字母,而其他字符保持不變,將更改的部分寫入stdout,然后讀取下一部分,然后一次又一次地執行所有操作。

最后,它應該通過命令運行程序來處理設置為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

樣品運行

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

使用gdb運行示例,一次執行一條指令。

gdb凱撒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM