Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 11
1
NASM

Перевод на новую строку с printf

06.06.2018, 21:23. Показов 5282. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Необходимо найти простые делители числа. Есть такой код:

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
45
46
47
48
49
50
extern printf
extern _exit
extern scanf
global _main
 
section .data
    x dd 0
    f db "%d",0
    
section .text
_main:
    push x
    push f
    call scanf
    add esp, 8
    
    mov eax, [x]
    mov ebx, 1
    
.for:
    cmp eax, 1
    jbe .end
    
    add ebx, 1
    
    mov ecx, eax
    mov edx, 0
    div ebx
    mov eax, ecx 
    
    test edx, edx
    jnz .for
 
    push ebx
    push f
    call printf 
    add esp, 8
    
.divide:
    mov ecx, eax
    mov edx, 0
    div ebx
    test edx, edx
    jz .divide
    mov eax, ecx
    jmp .for
    
.end:
    push dword 0
    call _exit
Но у меня возникла проблема с выводом. Мне необходимо вывести все числа друг под другом (или в строку) но выводит он только по одному. Пробовал изменить f db "%d",0 на f db "%d",13,10,0 но во первых приходится число два раза вводить, а во вторых на всех числах кроме 12 зависает. Помогите...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2018, 21:23
Ответы с готовыми решениями:

Перевод на новую строку
Здравствуйте. Прошу помочь в решении вот такой задачи: Использую функцию htmlspecialchars для...

Перевод на новую строку
Почему echo "\n"; не переводит на новую строку?

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

Перевод на новую строку
Когда на форму кладешь поле для ввода текста, а затем просматриваешь приложение, вот что...

6
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
06.06.2018, 21:38 2
Assembler
1
f db "%d\n",0
1
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 11
06.06.2018, 22:40  [ТС] 3
Я пробовал уже, это не работает
Добавлено через 40 минут
ну или может я где в коде ошибся? выводит только один простой делитель, а если это 11 то еще и зависает..
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
06.06.2018, 23:01 4
Лучший ответ Сообщение было отмечено strekozlinski как решение

Решение

Действительно какой-то урезанный printf.

Но не надо для printf и scanf одну и ту-же форматную строку использовать.
Для scanf
Assembler
1
fi db "%d",0
Для printf
Assembler
1
fo db "%d ",0
Добавлено через 48 секунд
Цитата Сообщение от strekozlinski Посмотреть сообщение
ну или может я где в коде ошибся?
И это тоже имеет место.

Добавлено через 5 минут
Даже в двух местах. И алгоритм какой-то кривой (верхняя половина в ней все логично, а нижняя ... что-то там такое, что я уже не понял) и вызов printf регистр eax запортит, а ты полагаешь что нет.

Вызов printf в регистре eax вернет свой результат, регистры ecx edx может запортить, но вот ebx esi edi портить не имеет права. Поэтому будем хранить две переменные, что нам и после printf понадобятся, в ebx и esi :
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
45
extern printf
extern _exit
extern scanf
global _main
 
section .data
    x dd 0
    fi db "%d",0
    fo db "%d ",0
    
section .text
_main:
    push x
    push fi
    call scanf
    add esp, 8
    
    mov ebx, [x]
.again:
    mov esi, 1
.for:
    mov eax, ebx
 
    cmp eax, 1
    jbe .end
    
    inc esi
    xor edx, edx
    div esi
 
    test edx, edx
    jnz .for
 
    mov ebx, eax
 
    push esi
    push fo
    call printf
    add esp, 8
 
    jmp .again
    
.end:
    push dword 0
    call _exit
4
1 / 1 / 0
Регистрация: 19.12.2017
Сообщений: 11
06.06.2018, 23:07  [ТС] 5
господи, спасибо тебе большое, добрый ты человек
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
06.06.2018, 23:09 6
Пожалуйста.
1
Asm/C++/Delphi/Py/PHP/VBA
6747 / 1993 / 231
Регистрация: 14.12.2014
Сообщений: 4,186
Записей в блоге: 12
09.06.2018, 21:01 7
Цитата Сообщение от Ethereal Посмотреть сообщение
Действительно какой-то урезанный printf.
Он не урезанный. Когда ты в Си пишешь "\n", компилятор автоматом заменяет на db 10. А тут строка как есть.

Добавлено через 3 минуты
В NASM тоже можно написать \n, но только не в обычных кавычках, а в обратных: db `%d\n\0`
3
09.06.2018, 21:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2018, 21:01
Помогаю со студенческими работами здесь

Перевод на новую строку в edit
У меня такой вопрос: в edit со свойством Multiline есть текст, засовываю я его туда программным...

Перевод каретки на новую строку
С помощью какой функции каретка переводится на новую стоку?

Перевод на новую строку (txt)
Господа, всплыл такой вопрос. Начисто забыл как делается такая вещь: fprintf(f,"%s",word); ...

Перевод каретки на новую строку
Решаю задачу на тимусе №1601. Все работает, как нужно, но есть проблемы с переводом каретки на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru