首页 > 解决方案 > 读取二进制文件并输出 base64:如何提取 6 位组?

问题描述

我已经开始学习 x64 汇编编程,现在我在学校的练习是创建一个二进制到 base 64 的转换器。

我已经找到了读取输入文件的方法,但现在我需要将二进制数分成 6 个数字组,然后将它们转换。

我现在有一个 .asm 文件,它可以读取输入文件,然后在命令 shell 中显示它。但现在我坚持浏览数据,读取二进制数据并将它们转换为 base 64。

这是我的文件:

%define SYS_EXIT 60
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_OPEN 2
%define SYS_CLOSE 3
%define STDOUT 1

%define BUFFER_SIZE 2048

section .data
    fd dw 0
    
    Base64Table: db "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Space: db " "
    Counter: dd 0
section .bss
    file_buffer resb BUFFER_SIZE
section .text
global  _start
_start:
    add rsp, byte 10h                       ;take the argument
    pop rdi                                         ;pop from the stack to put filename in rdi for sys_open command
    
    mov rax, SYS_OPEN                   ;system_call sys_open
    mov rsi, 0                                      ;flags 0, filename already gived before
    syscall                                         ;start call
    mov [fd], rax                               ;fd linked to rax value
    
    mov rcx, [Counter]

_read_write:
    mov rax, SYS_READ                       ;system_call sys_read
    mov rdi, [fd]                               ;file descriptor
    mov rsi, file_buffer                        ;char -> buffer
    mov rdx, BUFFER_SIZE                    ;buffer size 
    syscall
    

    cmp rax, 0                                  ;compare if end of string
    je _exit                                            ;jump equal to _exit
    inc rcx
    cmp rcx , 6
    je _addSpace

    mov rdx, rax                                ;length equal to system_call id 
    mov rax, SYS_WRITE                      ;system_call sys_write
    mov rdi, STDOUT                         ;id for STDOUT 1
    mov rsi, file_buffer                        ;size of output
    syscall

    jp _read_write                              ;jump to _read_write


_addSpace:
    mov rcx, 0
    mov [Counter], rcx
    mov rax, SYS_WRITE                      ;system_call sys_write
    mov rdi, STDOUT                         ;id for STDOUT 1
    mov rsi, Space                              ;size of output
    mov rdx, 1
    syscall
    
    jp _read_write

_exit:
    mov rax, SYS_CLOSE                      ;system_call sys_close
    mov rdi, fd                                 ;file descriptor
    syscall

    mov [file_buffer], dword 10         ;add file_buffer \n -> dword 10
    mov rax, SYS_WRITE                      ;system_call sys_write
    mov rdi, STDOUT                         ;sys_write call stdout
    mov rsi, file_buffer                        ;chars to write
    mov rdx, 1                                  ;length to write
    syscall

    mov rax, 60                                 ;system_call exit
    mov rdi, 0                                  ;int error code
    syscall

标签: assemblybase64converters

解决方案


推荐阅读