assembly - 读取二进制文件并输出 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
解决方案
推荐阅读
- r - 编码问题:在R中将字节转换为汉字
- istio - 无法使用“将大型虚拟服务和目标规则拆分为多个资源”
- spring-mvc - 如何使用 Spring Ldap Authentication 和 spring mvc 对用户进行身份验证
- php - 在 php 中使用 setTime 和 DateTimeImmutable 时无法更改分钟
- firebase - 如何使用 firebase firestore 最小化我的颤振应用程序中的 RAM 消耗?
- php - 使用 PHP 备份 SQL Server
- javascript - js promise如何让外循环等待内循环完成
- javascript - 如何仅在子 div 元素中而不在父 div 中触发 onclick 事件?
- r - 删除 data.frame 中不包含特定值的列?
- npm - 如何升级到 ember-cli 3.17.0?