Строки и вывод данных
Завершение программы:программы
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 ; $ - текущая позиция ассемблера
Использование системного вызова
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