Следуя этой теме, Как мне прочитать односимвольный ввод с клавиатуры с помощью nasm (сборки) в ubuntu?, я пытаюсь скомпилировать программу, которая повторяет ввод в NASM. Я сделал следующие файлы:
my_load2.asm:
%include "testio.inc"
global _start
section .text
_start: mov eax, 0
call canonical_off
call canonical_on
testio.inc:
termios: times 36 db 0
stdin: equ 0
ICANON: equ 1<<1
ECHO: equ 1<<3
canonical_off:
call read_stdin_termios
; clear canonical bit in local mode flags
push rax
mov eax, ICANON
not eax
and [termios+12], eax
pop rax
call write_stdin_termios
ret
echo_off:
call read_stdin_termios
; clear echo bit in local mode flags
push rax
mov eax, ECHO
not eax
and [termios+12], eax
pop rax
call write_stdin_termios
ret
canonical_on:
call read_stdin_termios
; set canonical bit in local mode flags
or dword [termios+12], ICANON
call write_stdin_termios
ret
echo_on:
call read_stdin_termios
; set echo bit in local mode flags
or dword [termios+12], ECHO
call write_stdin_termios
ret
read_stdin_termios:
push rax
push rbx
push rcx
push rdx
mov eax, 36h
mov ebx, stdin
mov ecx, 5401h
mov edx, termios
int 80h
pop rdx
pop rcx
pop rbx
pop rax
ret
write_stdin_termios:
push rax
push rbx
push rcx
push rdx
mov eax, 36h
mov ebx, stdin
mov ecx, 5402h
mov edx, termios
int 80h
pop rdx
pop rcx
pop rbx
pop rax
ret
Потом бегу:
[root@localhost asm]# nasm -f elf64 my_load2.asm
[root@localhost asm]# ld -m elfx86_64 my_load2.o -o my_load2
Когда я пытаюсь запустить его, я получаю:
[root@localhost asm]# ./my_load2
Segmentation fault
Отладчик говорит:
(gdb) run
Starting program: /root/asm/my_load2
Program received signal SIGSEGV, Segmentation fault.
0x00000000004000b1 in canonical_off ()
Может кто-нибудь объяснить, почему он вылетает без шага «импорта»? Кроме того, я запускаю RHEL в Virtualbox под 64-разрядной версией Win7. Может ли это вызвать проблемы с компиляцией?
write_stdin_termios
. У вас может быть опубликована неполная версия кода. - person starrify   schedule 25.11.2013termios
структура находится вsection .text
- постоянной памяти. Помогло бы помещение вsection .data
? - person Frank Kotler   schedule 25.11.2013ld
не должен бытьelf_x86_64
вместоelfx86_64
? - person Richard Fearn   schedule 30.12.2013