简体   繁体   中英

Nasm: Print on console

I made this program that open a image file and find a hidden message in the file. I have to print the message on the console.

i think the part where i open the file and search for the hidden message is right, but i don´t know for sure because i can´t print the output to confirm.

this is the code:

; Example program to demonstrate file I/O.
; This example will open/create a file, write some
; information to the file, and close the file.
; Note, the file name is hard-coded for this example.
; This example program will open a file, read the
; contents, and write the contents to the screen.
; This routine also provides some very simple examples
; regarding handling various errors on system services.
; -------------------------------------------------------
section .data
; -----
; Define standard constants.
LF equ 10 ; line feed
NULL equ 0 ; end of string
TRUE equ 1
FALSE equ 0
EXIT_SUCCESS equ 0 ; success code
STDIN equ 0 ; standard input
STDOUT equ 1 ; standard output
STDERR equ 2 ; standard error
SYS_write equ 1; write
SYS_read equ 0 ; read
SYS_open equ 2 ; file open
SYS_close equ 3 ; file close
SYS_exit equ 60 ; terminate
SYS_creat equ 85 ; file open/create
SYS_time equ 201 ; get time
O_CREAT equ 0x40
O_TRUNC equ 0x200
O_APPEND equ 0x400
O_RDONLY equ 000000q ; read only
O_WRONLY equ 000001q ; write only
S_IRUSR equ 00400q
S_IWUSR equ 00200q
S_IXUSR equ 00100q
; -----
; Variables/constants for main.
BUFF_SIZE equ 256
newLine db LF, NULL
db LF, LF, NULL
fileName dq 6
fileDesc dq 0
errMsgOpen db "Error opening the file.", LF, NULL
errMsgRead db "Error reading from the file.", LF, NULL
offset db 1
size db 1
; -------------------------------------------------------
section .bss
readBuffer: resb BUFF_SIZE
; -------------------------------------------------------
section .text
global _start
_start:
xor rax, rax
xor rcx, rcx
xor rdx, rdx
xor rbx, rbx
mov rbx, rsp
mov rax, qword [rbx+16]
mov [fileName], rax
xor rax, rax
push rsp

; Attempt to open file - Use system service for file open

openInputFile:
pop rax ; pop argc value - should be 2
cmp rax, 0x2    
jne done
mov rax, SYS_open ; file open
mov rdi, fileName ; file name string
mov rsi, O_RDONLY ; read only access
syscall ; call the kernel
cmp rax, 0 ; check for success
jl errorOnOpen
mov qword [fileDesc], rax ; save descriptor
; -----
; Read from file.
;
mov rax, SYS_read
mov rdi, qword [fileDesc]
mov rsi, readBuffer
mov rdx, BUFF_SIZE
syscall
cmp rax, 0
jl errorOnRead
; -----
; Print the buffer.
; add the NULL for the print string
mov rax, qword [readBuffer+2] ;SSSS
mov qword [size], rax
mov rax, qword [readBuffer+10] ;OOOO
mov [offset], rax
mov rcx, 0


ler: ;ler um caracter
mov rbp, 0
xor rbx, rbx
xor rdx, rdx

lerloop:
inc rax
cmp rax, [size]
je errorOnRead

saltaQuartobyte:
inc ecx
cmp ecx, 4
jne continua
inc rax ;incremneta rax outra vez para saltar o quarto
cmp rax, [size]
je errorOnRead
mov ecx, 0

continua:
mov bl, byte [readBuffer+rax]
shl rdx, 1
shr rbx, 1
adc rdx, 0

inc rbp
cmp rbp, 7 ;fim do caracter ASCII, 0X 0XXX XXXX
jne lerloop

mov rdi, rdx
call printString ; imprime caracter ASCII

cmp rax, [size] ;comea o priximo
jne ler
; -----
; Close the file.

mov rax, SYS_close
mov rdi, qword [fileDesc]
syscall
jmp done
; -----
; Error on open.

errorOnOpen:
mov rdi, errMsgOpen
call printString
jmp done

; Error on read.

errorOnRead:
mov rdi, errMsgRead
call printString
jmp done
; -----
; program done.
done:
mov rax, SYS_exit
mov rdi, EXIT_SUCCESS
syscall

; **********************************************************
; Generic procedure to display a string to the screen.

global printString
printString:
push rbp

mov rbp, rsp
push rbp
; -----
; Call OS to output string.
mov rax, SYS_write ; code for write()
mov rsi, rdi ; addr of characters
mov rdi, STDOUT ; file descriptor
; count set above
syscall ; system call
; -----
; String printed, return to calling routine.
prtDone:
pop rbx
pop rbp
ret

this is my last attempt of the print but the program still don't print anything, and I don't understand why? or what's wrong?

A fundamental error

push rsp; Attempt to open file - Use system service for file open openInputFile: pop rax; pop argc value - should be 2 cmp rax, 0x2 jne done mov rax, SYS_open; file open

Your program starts with copying the stackpointer RSP to the accumulator RAX , and then compares to see if the value is 2, but when is the stackpointer ever going to be 2 ? And so, the program will always prematurely exit . No wonder that nothing gets printed.

A selection of other errors

offset db 1 size db 1... mov rax, qword [readBuffer+2];SSSS mov qword [size], rax mov rax, qword [readBuffer+10];OOOO mov [offset], rax

You have reserved not enough room to store the qwords size and offset !

Better store them in the.bss section using resq :

section .bss
readBuffer: resb BUFF_SIZE
offset      resq 1
size        resq 1

 mov rax, qword [readBuffer+2];SSSS mov qword [size], rax mov rax, qword [readBuffer+10];OOOO mov [offset], rax

If the file is a.BMP (I'm considering those well-known offsets), then the size and offset fields are actually dwords . You would have to write instead (loading EAX automatically zero extends the value into RAX ):

mov   eax, [readBuffer+2] ;SSSS
mov   [size], rax
mov   eax, [readBuffer+10] ;OOOO
mov   [offset], rax

 printString: push rbp mov rbp, rsp push rbp <<<<... pop rbx <<<< pop rbp ret

Because of the mismatch, you're destroying RBX on return.

The code that you used depends on calculating the length of the ASCIIZ string. You cannot just leave that out!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM