2017-01-27 3 views
1

Я попытался написать простую программу приветствия, используя сборку x86, которая принимает имя пользователя и распечатывает «Hello [userName]» Проблема заключается в том, что первая символика имени пользователя удваивается при печати приветствия msg, для пример:Сборка x86, программа приветствия

вход:

Black Knight 

выход:

Hello BBlack Knight 

и вот мой код

global _start 

section .data 
    msg1  db "Hello " 
    user_input times 20 db 0 


section .bss 

section .text 

_start : 

; read 
mov eax , 3 
mov ebx , 0 
mov ecx , user_input 
mov edx , 20 
int 0x80 

; write 
mov eax , 4 
mov ebx , 1 
mov ecx , msg1 
mov edx , 7 
int 0x80 

mov eax , 4 
mov ebx , 1 
mov ecx , user_input 
mov edx , 20 
int 0x80 

; exit 
mov eax , 1 
mov ebx , 0 
int 0x80 
+0

Если ваш user_input буфер следует за msg1 непосредственно в памяти (например, выше), вы также можете выводить его как одну большую строку за один вызов, т.е. ecx = msg1, edx = 6 + 20. (выглядит как хороший пример для студентов, что в Assembly отсутствуют переменные, но компьютерная память состоит из последовательных байтов, и ваш код полностью отвечает за предоставление всего этого «структурного» значения, известного на языках высокого уровня, ярлыки - это просто псевдонимы адресов памяти, не более). Таким образом, по макету памяти, который вы определили, вы ввели пользовательский ввод для добавления в msg1 в памяти и который может быть использован во время записи – Ped7g

ответ

2

Это происходит из-за этого кода:

; write 
mov eax , 4 
mov ebx , 1 
mov ecx , msg1 
mov edx , 7 
int 0x80 

Вы здесь говорите инструкции записи, что строка для печати 7 байт в длину, когда она, в самом деле, 6.

Почему удвоенный B? Поскольку в памяти введенное имя появляется начиная с байта сразу, следующего за msg1.

Вы можете решить эту проблему, напечатав только 6 символов (Hello + space) или добавив нулевой ограничитель в конец вашего значения msg.

+0

OMG, теперь он работает, спасибо –

Смежные вопросы