我得到argv[1]的值是x86_64 Linux Assembly,但一些额外的bash内容被添加到最后。我可以删除它的唯一方法是通过保留更少的字节,但argv[1]将是一个动态值。
bits 64
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MACROS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
%define SYS_WRITE 1
%define SYS_EXIT 60
%define EXIT_SUCESS 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SECTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .bss
filename: resb 32
section .data
usage_msg: db "Usage: ./pac <filename>", 10, 0
usage_msg_len: equ $-usage_msg
section .text
global _start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROGRAM ENTRY POINT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_start:
pop rax ; pop argc into rax
cmp rax, 2 ; make sure <filename> has been passed
jl .not_enough_args
jmp .enough_args
.not_enough_args:
call print_usage
jmp .exit
.enough_args:
pop rax
pop rax ; pop argv[1] into rax
mov [filename], rax ; move argv[1] into filename
; print filename for testing
mov rax, SYS_WRITE
mov rdi, SYS_WRITE
mov rsi, [filename]
mov rdx, 32
syscall
jmp .exit
.exit:
mov rax, SYS_EXIT
mov rdi, EXIT_SUCESS
syscall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CALLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
print_usage:
mov rax, SYS_WRITE
mov rdi, SYS_WRITE
mov rsi, usage_msg
mov rdx, usage_msg_len
syscall
ret
使用这个程序,我得到以下输出:
$ ./pac file.txt
file.txtSHELL=/bin/bashSESSION
请帮我一下。谢谢大家。
1条答案
按热度按时间du7egjpx1#
有一段时间了,我决定重写一遍。不知道我做了什么不同的,但我解决了它。我还添加了puts和strlen。
输出: