Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

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

27.07.2011, 19:55. Просмотров 2118. Ответов 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"
Лично у меня косяк обнаружить так и не получилось, поэтому пришел за помощью

Не по теме:

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

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

Fasm + linux + ide
Господа! В данный момент приходится кодить на fasm под Linux (Debian). Хотелось...

Программирование SIMD библиотек на Fasm в x86-64 Linux
Начал недавно проект по разработке SIMD бибилиотек для С++ на Fasm под 64-bit...

Как сложить два числа с плавающей точкой в Linux
Здравствуйте, скажите пожалуйста как сложить два числа с плавающей точкой в...

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

fasm
org 100h mov cl,0 mov ch,255 cikl: mov ah,0eh shl ch,1 jc perivod mov...

6
Goodwin98
2521 / 817 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
27.07.2011, 20:03 #2
не обнуляется edx перед делением.
1
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
27.07.2011, 20:09  [ТС] #3
Цитата Сообщение от Goodwin98 Посмотреть сообщение
не обнуляется edx перед делением.
К сожалению, не помогло. Выводится только старший разряд числа, а сама программа завершается с кодом ошибки.
0
Goodwin98
2521 / 817 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
27.07.2011, 20:30 #4
Цитата Сообщение от fasked Посмотреть сообщение
К сожалению, не помогло. Выводится только старший разряд числа, а сама программа завершается с кодом ошибки.
Странно.... У меня, к сожалению нет возможности попробовать ваш код на линуксе, но, переделав вывод, я вполне нормально запустил программу под досом. Единственной ошибкой было отсутствие очистки регистра edx... Быть может вы не туда xor edx,edx вставили ? >_>
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 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 / 11
Регистрация: 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
Эксперт С++
4981 / 2560 / 241
Регистрация: 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
Просьба,пожалуйста прокомментируйте,что делает компилятор в двух случаях...

WinApi и fasm
Есть ли толковая документации по использованию winapi в fasm'e ?

MSXML (Fasm)
Много раз уже слышал об этой библиотеке, но может ктнибудь покажет примерчик...


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

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

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