Я новичок в языке ассемблера и столкнулся с проблемой на первых шагах. У меня есть некоторый опыт работы с языками высокого уровня, но я чувствую себя полным новичком на этом низком уровне.
Я использую ассемблер GNU (газ) версии 2.23 x86_64 в системе Xubuntu.
Я написал простой привет, мир, и теперь я хочу расширить его до следующих функций:
- чтение ввода с помощью системного вызова 3
- проверить, больше ли ввод, чем указанный
- если короче или равно, напечатайте ввод
- иначе вывести сообщение об ошибке
Если я запускаю код, он работает для более короткого ввода, но если я ввожу больше 5 символов, я получаю нарушение прав доступа.
Я работаю с этим (немецким) руководством.
Вот мой код:
#
# author: linluk
# filename: name.s
#
# usage:
# $ as name.s -o name.o
# $ ld name.o -o name
# $ ./name
#
.section .data
hello: .ascii "hello, what is your name?\n"
err: .ascii "too long!\n"
name: .ascii ""
.section .text
.globl _start
_start:
#output
mov $4, %eax # 4 syscall write
mov $1, %ebx # 1 filedescriptor stdout
mov $hello, %ecx # output buffer
mov $26, %edx # length of buffer
int $0x80 # call
#input
mov $3, %eax # 3 syscall read
mov $0, %ebx # 0 filedescriptor stdin
mov $(name), %ecx # address of name
mov $6, %edx # max length
int $0x80
#check input length
mov $5, %ebx #######################
cmp %ebx, %eax # <-- HERE or #
jg problem #to long # <-- HERE #
# IS SOMETHING WRONG #
# I GUESS !! #
#output of $name #######################
mov $1, %ebx
mov $name, %ecx
mov %eax, %edx
mov $4, %eax
int $0x80
jmp exit
problem:
#output of $err
mov $4, %eax
mov $1, %ebx
mov $err, %ecx
mov 10, %edx
int $0x80
exit:
mov $1, %eax # 1 syscall exit
mov $0, %ebx # returnvalue
int $0x80
name
. Попробуйте:name: .space 6
. Ошибка вызвана отсутствием знака$
в строкеmov 10, %edx
. Научитесь пользоваться отладчиком. - person Jester   schedule 10.03.2014$ gdb name
, а затем>> start
, но он говорит, что нет основной функции... мне нужно научиться использовать отладчик в исходном коде сборки. БОЛЬШОЕ СПАСИБО! :) - person linluk   schedule 10.03.2014int $0x80
и строки#check input length
- person User.1   schedule 12.03.2014