Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler: Linux

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
fasked
Эксперт С++
4976 / 2556 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Вывод числа: Linux и FASM - Assembler

27.07.2011, 19:55. Просмотров 2098. Ответов 6

Решил поупражняться в ассемблере, и (наверное, почти как и все) столкнулся с проблемой вывода числа. Однако, не нашел ни единого примера для Linux и FASM. Попробовал набросать, программа корректно отрабатывает, если число состоит из одного разряда и вылетает, если разрядов больше.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
format ELF executable 3
entry __start
 
segment readable executable
 
; Print a number 
; eax - number to print
; ebx - base
__print_num:
        xor     ecx, ecx
        @@:
                div     ebx
                push    edx
                inc     ecx
 
                test    eax, eax
                jnz     @b
 
                mov     eax, 4
                mov     ebx, 1
        @@:
                pop     edx
                mov     esi, ecx
 
                lea     ecx, [_ascii_num + edx]
                mov     edx, 1
                int     0x80
 
                mov     ecx, esi
                loop    @b
        ret
 
__start:
        mov     eax, 9
        mov     ebx, 10
        call    __print_num
 
        mov     eax, 1
        mov     ebx, 0
        int     0x80
 
segment readable writeable
 
_ascii_num db "01234567890ABCDEF"
Лично у меня косяк обнаружить так и не получилось, поэтому пришел за помощью

Не по теме:

Сильно не пинайте

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2011, 19:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывод числа: Linux и FASM (Assembler):

Fasm + linux + ide - Assembler
Господа! В данный момент приходится кодить на fasm под Linux (Debian). Хотелось бы узнать ваше мнение какую IDE можно подружить с fasm'ом....

Программирование SIMD библиотек на Fasm в x86-64 Linux - Assembler
Начал недавно проект по разработке SIMD бибилиотек для С++ на Fasm под 64-bit Linux. Интересно услышать мнение матерых программеров как о...

Перевод числа в текстовую строку, исправить код (FASM) - Assembler
Помогите найти ошибку в программе и исправить её( программа должна переводить данное число в текстовую строку(в десятичной системе) и...

Вызываю dll (написанную на vc++2008) из Fasm. Через 40 секунд вылет из программы.Без вызова dll из Fasm программа не вылетает. - Assembler
Программа на vc++2008: #include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { ...

Как сложить два числа с плавающей точкой в Linux - Assembler
Здравствуйте, скажите пожалуйста как сложить два числа с плавающей точкой в линуксе, желательно простой пример программы. Добавлено...

Перенос программы под Linux: номера системных вызовов в DOS и Linux не совпадают - Assembler
Здравствуйте, уважаемые программисты всея форума! Доброго вам времени суток! =) Есть у меня задание - перенести программу, написанную...

6
Goodwin98
2521 / 817 / 9
Регистрация: 31.05.2009
Сообщений: 1,672
27.07.2011, 20:03 #2
не обнуляется edx перед делением.
1
fasked
Эксперт С++
4976 / 2556 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.07.2011, 20:09  [ТС] #3
Цитата Сообщение от Goodwin98 Посмотреть сообщение
не обнуляется edx перед делением.
К сожалению, не помогло. Выводится только старший разряд числа, а сама программа завершается с кодом ошибки.
0
Goodwin98
2521 / 817 / 9
Регистрация: 31.05.2009
Сообщений: 1,672
27.07.2011, 20:30 #4
Цитата Сообщение от fasked Посмотреть сообщение
К сожалению, не помогло. Выводится только старший разряд числа, а сама программа завершается с кодом ошибки.
Странно.... У меня, к сожалению нет возможности попробовать ваш код на линуксе, но, переделав вывод, я вполне нормально запустил программу под досом. Единственной ошибкой было отсутствие очистки регистра edx... Быть может вы не туда xor edx,edx вставили ? >_>
0
fasked
Эксперт С++
4976 / 2556 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.07.2011, 11:13  [ТС] #5
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Быть может вы не туда xor edx,edx вставили ? >_>
Не буду исключать и такого варианта
Assembler
1
2
3
4
5
6
7
8
9
        @@:
                xor     edx, edx
                div     ebx
 
                push    edx
                inc     ecx
 
                test    eax, eax
                jnz     @b
А может ли быть причина в том, что система x86_64, а код написан в соответствии с x86?
0
qwarta
73 / 73 / 7
Регистрация: 20.11.2009
Сообщений: 238
30.07.2011, 23:13 #6
fasked, во втором цикле при первом проходе прерывание 0x80 меняет значение в eax. Поэтому, при втором проходе вместо sys_write (eax=4) происходит sys_exit (eax=1) и отображается только один разряд числа.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
format ELF
 
section '.text' executable
 
public _start
_start:
                mov     eax, 956
                mov     ebx, 10
                call    __print_num
 
                mov     eax, 1
                mov     ebx, 0
                int     0x80
                
__print_num:
        xor     ecx, ecx
        @@:
                xor     edx,edx
                div     ebx
                push    edx
                inc     ecx
 
                test    eax, eax
                jnz     @b
 
                mov     ebx, 1
        @@:
                mov     eax,4
                pop     edx
                mov     esi, ecx
 
                lea     ecx, [_ascii_num + edx]
                mov     edx, 1
                int     0x80
 
                mov     ecx, esi
                loop    @b
        ret
 
 
 
_ascii_num db "01234567890ABCDEF"
P.S.
При поиске ошибки использовал отладчик ald
1
fasked
Эксперт С++
4976 / 2556 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
31.07.2011, 03:43  [ТС] #7
Цитата Сообщение от qwarta Посмотреть сообщение
во втором цикле при первом проходе прерывание 0x80 меняет значение в eax.
Спасибо, и правда все заработало
Цитата Сообщение от qwarta Посмотреть сообщение
При поиске ошибки использовал отладчик ald
За ссылочку отдельное спасибо, ибо gdb вроде как вообще не понимает fasm, либо только после дополнительных танцев.
0
31.07.2011, 03:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 03:43
Привет! Вот еще темы с ответами:

fasm - Assembler
org 100h mov cl,0 mov ch,255 cikl: mov ah,0eh shl ch,1 jc perivod mov al, '0' jmp label2 perivod:

SetSysColors (FASM) - Assembler
Напишите пожалуйста программу (за меня), чтобы цвет всех окон Windows изменить. Диалоги никакие не нужны, просто изменить....

прерывание в fasm - Assembler
Я создал программу вывода на экран веке кода клавиши. С помощью int 16h .но за into 16h скрывается много функций. Каким образом происходит...

FASM WinInet - Assembler
Решил попробовать написать программу, которая бы выводила первые 1023 (например, просто не знаю как всю страницу вывести :) байт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru