@acuruma

Что делать если компилятор nasm работает неправильно?

вот код программы, я его скопировал:
SYS_EXIT  equ 1
SYS_READ  equ 3
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1
 
segment .data 
 
   msg1 db "Enter a digit ", 0xA,0xD 
   len1 equ $- msg1 
 
   msg2 db "Please enter a second digit", 0xA,0xD 
   len2 equ $- msg2 
 
   msg3 db "The sum is: "
   len3 equ $- msg3
 
segment .bss
 
   num1 resb 2 
   num2 resb 2 
   res resb 1    
 
section	.text
   global _start    ; должно быть объявлено для использования gcc
	
_start:             ; сообщаем линкеру входную точку
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg1         
   mov edx, len1 
   int 0x80                
 
   mov eax, SYS_READ 
   mov ebx, STDIN  
   mov ecx, num1 
   mov edx, 2
   int 0x80            
 
   mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg2          
   mov edx, len2         
   int 0x80
 
   mov eax, SYS_READ  
   mov ebx, STDIN  
   mov ecx, num2 
   mov edx, 2
   int 0x80        
 
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg3          
   mov edx, len3         
   int 0x80
 
   ; перемещаем первое число в регистр EAX, а второе число - в регистр EBX
   ; и вычитаем ASCII '0' для конвертации в десятичное число
	
   mov eax, [num1]
   sub eax, '0'
	
   mov ebx, [num2]
   sub ebx, '0'
 
   ; складываем eax и ebx
   add eax, ebx
 
   ; добавляем '0' для конвертации суммы из десятичной системы в ASCII
   add eax, '0'
 
   ; сохраняем сумму в ячейке памяти res
   mov [res], eax
 
   ; выводим сумму
   mov eax, SYS_WRITE        
   mov ebx, STDOUT
   mov ecx, res         
   mov edx, 1        
   int 0x80
 
exit:    
   
   mov eax, SYS_EXIT   
   xor ebx, ebx 
   int 0x80

компилировал же при помощи следующих команд:
nasm -f elf name.asm
ld -m elf_i386 -s -o name name.o
./name

и мне выдает непонятную фигню:
Число a + число b = �
Изменено: забыл добавить, но это совсем из другой программы, которая была в этом файле
  • Вопрос задан
  • 140 просмотров
Решения вопроса 2
1MK-Ultra
@1MK-Ultra
программист
Где то ошибка в коде. Я много раз уже сталкивался с тем, что компилятор компилирует "неправильно". Потом всегда оказывалось, что ошибка моя, и компилятор не виноват. Где точно не знаю, я не специалист по ассемблеру. Такое часто получается с кодами которые не сам написал, а сделал ctrl+c, ctrl+v.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
выдает непонятную фигню

Ну в программе нет проверки ввода, поэтому если вводить непонятную фигню, то и выводить она будет непонятную фигню. А если вводить цифры, так чтобы сумма не превышала 9, то приведённая программа прекрасно работает.
Это, правда не значит, что в этой программе нет ошибок. Я вижу как минимум одну:
res resb 1 
…
mov [res], eax

классическое переполнение буфера. Её наличие, правда, на результат повлиять не может.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы