@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 = �
Изменено: забыл добавить, но это совсем из другой программы, которая была в этом файле
  • Вопрос задан
  • 156 просмотров
Решения вопроса 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

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

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

Похожие вопросы