Сборка x86 - печать символа с заданным кодом ascii
Я новичок в программировании на ассемблере и у меня возникают проблемы при выводе символов на экран. Каждый раз, когда я выполняю свою программу, я получаю ошибку сегментации, и я не уверен почему.
.section .data
A:
.long 65 # ascii code for 'A'
.section .text
.globl _start
_start:
movl $1, %edx # length of character to print, 1
movl A, %ecx # what I want printed
movl $1, %ebx # file descriptor for STDOUT
movl $4, %eax # syscall number for sys_write
int $0x80 # calls kernel
movl $0, %ebx # return status
movl $1, %eax # syscall number for sys_exit
int $0x80 # calls kernel
Это команды, которые я использую для сборки(мой файл называется write.s)
as write.s -o write.o
ld write.o -o write
Разве это не правильный способ печати символа? Любая помощь будет оценена.
1 ответ
Решение
movl A, %ecx
означает: скопировать значение по адресу метки A в %ecx
, Правильная инструкция будет:
movl $A, %ecx
или же
leal A, %ecx
Вы можете использовать GDB для отладки в этих случаях (обратите внимание, что вы должны собрать с -g
флаг для получения отладочной информации):
$ as -g write.s -o write.o
$ ld write.o -o write
$ gdb write
GNU gdb (GDB) 7.5
[.. snip ..]
(gdb) b test.s:13
Breakpoint 1 at 0x4000c6: file test.s, line 13.
(gdb) run
Starting program: /home/niklas/tmp/asm/write
Breakpoint 1, _start () at test.s:13
13 int $0x80 # calls kernel
(gdb) info registers ecx
ecx 0x41 65
Как вы видите, %ecx
имеет целочисленное значение 65
что не то, что вы хотите.