Skip to main content

Строки и вывод данных

Завершение программы 

    mov rax, 60
    mov rdi, 0
    syscall

При использовании gcc можно 

    ret

Код возврата

Linux

Без отладчика можно смотреть состояние одного регистра за счет копирования его в регистр rdi (Linux) при завершении программы.

global _start           ; делаем метку метку _start видимой извне
 
section .text           ; объявление секции кода
_start:                 ; объявление метки _start - точки входа в программу 
    mov rdi, 23         ; помещаем в регистр rdi код возврата - 23 
    mov rax, 60         ; 60 - номер системного вызова exit
    syscall             ; выполняем системный вызов exit

Затем выполняется приложение, команда $? выводит код завершения предыдущей команды 

root@Eugene:~/asm# ./hello
root@Eugene:~/asm# echo $?
23

Windows: 

global _start       ; делаем метку метку _start видимой извне
 
section .text       ; объявление секции кода
_start:             ; метка _start - точка входа в программу
    mov rax, 23     ; помещаем в регистр rax код возврата - 23 
    ret             ; выход из программы

Получение кода возврата

echo %ERRORLEVEL%

Строки

Статичное определение строки и длины (для последующего вывода) 

section .data
	msg db "Hello!",10,0
    msg_len equ $ - msg  ; $ - текущая позиция ассемблера
    msg_half_len equ (msg_full_len - 2)/2 ; возможен такой расчет

Использование системного вызова 

global main
section .data
	msg db "Hello",10,0
    msg_len equ $ - msg
section .text
main: 
	mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, [msg_len] - 1
    syscall
    ret

Использование функции C 

global main
extern printf
section .data
  fmtint db "Result: %d",10,0
  fmtstr db "Outstring: %s",10,0
  msg db "for textout",0
...
section .text
main: 
...
; вывод числа
	mov rsi, <переменная> ; в rsi то что нужно вывести
    mov rax, 0
	mov rdi, fmtint 
	call printf 
; вывод строки
	mov rsi, msg
    mov rax, 0
	mov rdi, fmtstr 
	call printf