[nasm] [osx] - неправильное смещение данных для вывода после компиляции - Assembler
Формулировка задачи:
Добрый день друзья, написал простое приложение на асме, всё отлично компилирует, но работает неправильно, хотел узнать ваше мнение.
Итак, код:
Ничего сложного,
- выводится "What is your name? ",
- вводится текст к клавиатуры
- выводится "Hello, "
- выводится введенный с клавиатуры текст из пункта 2
- работа завершается с кодом 0
Компилирую
Версия nasm:
Запускаю
Знатоки, внимание вопрос. Где вывод "Hello, "?
Из замеченного при дебаге
смещение данных:
шагаю до места где кладем смещение в RSI и смотрю, что там на самом деле
ака ничего, смотрю где на самом деле текст
2013, поэтому ничего и не выводится.
У кого будут какие идеи? Спасибо за внимание.
%define SYSCALL_EXIT 0x2000001 %define SYSCALL_READ 0x2000003 %define SYSCALL_WRITE 0x2000004 %define SYSCALL_OPEN 0x2000001 %define SYSCALL_CLOSE 0x2000001 %define STDIN 0x0 %define STDOUT 0x1 %define STDERR 0x2 ; arguments: rdi, rsi, rdx, rcx, r8d, r9d; remaining arguments are on the stack. ; syscall number: rax ; return value: rax section .data text1 db "What is your name? " text1len equ $ - text1 text2 db "Hello, " text2len equ $ - text2 section .bss name resb 16 section .text global start start: call _printText1 call _getName call _printText2 call _printName mov rax, SYSCALL_EXIT mov rdi, 0 syscall _getName: mov rax, SYSCALL_READ mov rdi, STDIN mov rsi, name mov rdx, 16 syscall ret _printText1: mov rax, SYSCALL_WRITE mov rdi, STDOUT mov rsi, text1 mov rdx, text1len syscall ret _printText2: mov rax, SYSCALL_WRITE mov rdi, STDOUT mov rsi, text2 mov rdx, text2len syscall ret _printName: mov rax, SYSCALL_WRITE mov rdi, STDOUT mov rsi, name mov rdx, 16 syscall ret
nasm -f macho64 -o name.o name.asm && ld -o name name.o
mac:~ jabbson$ nasm -v NASM version 2.13.02 compiled on Nov 30 2017
mac:asm-codes jabbson$ ./name What is your name? jabbson jabbson mac:asm-codes jabbson$
Решение задачи: «[nasm] [osx] - неправильное смещение данных для вывода после компиляции»
textual
Листинг программы
section .text ; global _start ..start:
Объяснение кода листинга программы
..start
- это метка, которая указывает на точку входа в программу._start
- это глобальная переменная, которая указывает на точку входа в программу.section .text
- это директива сегментации, которая определяет сегмент для текста программы.- В данном коде нет переменных, поэтому этот пункт можно пропустить.
- В данном коде нет функций, поэтому этот пункт можно пропустить.
- В данном коде нет циклов, поэтому этот пункт можно пропустить.
- В данном коде нет условных операторов, поэтому этот пункт можно пропустить.
- В данном коде нет операций с памятью, поэтому этот пункт можно пропустить.
- В данном коде нет операций с регистрами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с числами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с строками, поэтому этот пункт можно пропустить.
- В данном коде нет операций ввода-вывода, поэтому этот пункт можно пропустить.
- В данном коде нет операций с файлами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с двоичными данными, поэтому этот пункт можно пропустить.
- В данном коде нет операций с символами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с датой и временем, поэтому этот пункт можно пропустить.
- В данном коде нет операций с указателями, поэтому этот пункт можно пропустить.
- В данном коде нет операций с массивами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с процедурами, поэтому этот пункт можно пропустить.
- В данном коде нет операций с библиотеками, поэтому этот пункт можно пропустить.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д