Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2023, 21:11   #1
BlareQ
Новичок
Джуниор
 
Регистрация: 22.01.2023
Сообщений: 3
Вопрос Заменить старшие и младшие цифры в числе на ассемблере

Необходимо поменять старшие и младшие цифры в числе, считывать из файла .txt, прога на плюсах должна быть, но весь функционал кроме ввода-вывода данных на ассемблере. Сам алгоритм работы знаю, но как это все описать на ассемблере - не понимаю
BlareQ вне форума Ответить с цитированием
Старый 22.01.2023, 21:59   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Добавляете в исходник на С++ такую строчку
Код:
extern "C" int swapdigit(int x);
и на ассемблере пишите примерно следующее: main.asm
Код:
; fasm1 v. 1.73.30

format elf

public swapdigit

section '.text' executable

swapdigit: ; eax = int x
    xor ecx, ecx ; ecx - знак числа (если на входе отрицательное число, тогда ecx = 1, иначе ecx = 0)
    test eax, eax
    jns @f
    inc ecx
    neg eax
@@: ; eax = abs(eax) взяли значение по модулю и подбираем делитель для получения старшего разряда основываясь на максимальном значении 32-битного числа (edx = делитель)
    mov edx, 1000000000
    cmp eax, edx
    jae @f
    mov edx, 100000000
    cmp eax, edx
    jae @f
    mov edx, 10000000
    cmp eax, edx
    jae @f
    mov edx, 1000000
    cmp eax, edx
    jae @f
    mov edx, 100000
    cmp eax, edx
    jae @f
    mov edx, 10000
    cmp eax, edx
    jae @f
    mov edx, 1000
    cmp eax, edx
    jae @f
    mov edx, 100
    cmp eax, edx
    jae @f
    mov edx, 10
    cmp eax, edx
    jc .error ; Число в 1 разряд нельзя поменять местами.
@@: ; Подобрали делитель. Начинаем выделять разряды числа. Сначала старший
    push ecx ; В стеке сохранен знак числа

    mov ecx, edx ; Разделим число на делитель, тогда частное будет равно старшему разряду, а в остатке будут остальные разряды
    cdq
    div ecx

    push eax ; Сохранили старший разряд. В стеке разряд, за ним знак
    push ecx ; Сохранили делитель, он еще понадобится, чтобы поднять младший разряд на место старшего. В стеке делитель, разряд, делитель и знак

    mov ecx, 10 ; А теперь делим остаток на 10. Это даст в остатке младший разряд, а в частном остальные разряды
    mov eax, edx
    cdq
    div ecx

    push edx ; Сохранили младший разряд. В стеке младший разряд, делитель (теперь множитель), старший разряд и знак

    mul ecx ; Умножив частное на 10 мы обнулили младший разряд
    xchg ecx, eax ; В ecx теперь хранятся средние разряды числа
    pop eax ; Восстановили из стека младший разряд в eax. В стеке еще есть множитель, старший разряд и знак
    pop edx ; Восстановили множитель в edx. В стеке еще есть старший разряд и знак
    mul edx ; Умножили младший разряд на множитель, что переместит его на место старшего разряда в числе
    pop edx ; Восстановили старший разряд (но он сейчас цифра и автоматически попадает на место младшего). В стеке еще есть знак

    add eax, ecx ; Добавляем к остальным разрядам числа младший, но сдвинутый на место старшего
    add eax, edx ; Добавили к остальным разрядам числа старший, но он сейчас просто цифра и попадает на место младшего

    pop ecx ; Восстановили из стеке знак числа в ecx и вернули его числу, если он был (ecx <> 0)
    jecxz @f
    neg eax
@@:
    retn ; Happy end

.error: ; При ошибке я возвращаю 0, хотя можно оставить число без изменения. Оно просто одноразрядное, но тогда надо добавить еще и проверку знака (он в ecx)
    xor eax, eax
    retn ; Bad end
А после собираем вместе
Код:
fasm ./main.asm ./fasm.o
g++ -o ./main ./main.cpp ./fasm.o
P.S. Набрал в браузере. За опечатки не серчайте. Я не проверял на работоспособность, но в целом должна работать.

Последний раз редактировалось macomics; 22.01.2023 в 22:53.
macomics вне форума Ответить с цитированием
Старый 22.01.2023, 22:37   #3
BlareQ
Новичок
Джуниор
 
Регистрация: 22.01.2023
Сообщений: 3
Радость

Спасибо огромное, серчать не буду, было бы за что). Можно попросить написать комментарии, если не затруднит, чтобы мог с алгоритмом разобраться побыстрее! Но спасибо в любом случае!!!
BlareQ вне форума Ответить с цитированием
Старый 22.01.2023, 22:53   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Добавил комментарии. Заодно исправил одну очепятку.
macomics вне форума Ответить с цитированием
Старый 22.01.2023, 22:55   #5
BlareQ
Новичок
Джуниор
 
Регистрация: 22.01.2023
Сообщений: 3
Лампочка

Огромное спасибо, очень благодарен. Хорошего времени суток!
BlareQ вне форума Ответить с цитированием
Старый 23.01.2023, 19:52   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Доброго здоровья. А что там с метками косяк что-ли? Где метка f?
Cuprum5 вне форума Ответить с цитированием
Старый 23.01.2023, 20:07   #7
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Не силён во вставках, поэтому алгоритм покажу полностью на ассемблере masm32
В стеке получаю массив цифр исходного числа.
Обмениваю первую и последнюю цифры в массиве.
Восстанавливаю итоговое число из массива цифр.
Код:
.686
.model flat, stdcall
option casemap :none
        .nolist
        include \masm32\include\windows.inc

        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\msvcrt.inc
        include \masm32\include\masm32.inc
        include \masm32\macros\macros.asm

        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\msvcrt.lib
        includelib \masm32\lib\masm32.lib

        .list
.data
.data?
        iResult         dd      ?
.code

main    proc

        mov     eax,    12345
        mov     edi,    10
        xor     ecx,    ecx
        @@:
                xor     edx,    edx
                div     edi
                push    edx
                inc     ecx
                test    eax,    eax
        jnz     @b
        mov     eax,    [esp+4*ecx-4]
        mov     ebx,    [esp]
        mov     [esp],  eax
        mov     [esp+4*ecx-4],  ebx
        xor     eax,    eax
        @@:
                pop     ebx
                lea     eax,    [eax+4*eax]
                lea     eax,    [ebx+2*eax]
        loop    @b
        mov     [iResult],      eax

        printf("%d\n", iResult)
        ;завершение программы
        invoke  ExitProcess, 0
main    endp

end     main
FPaul вне форума Ответить с цитированием
Старый 23.01.2023, 20:09   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
А что там с метками косяк что-ли? Где метка f?
Всё в порядке с метками.
Ищите "анонимные метки" и обрящите.
FPaul вне форума Ответить с цитированием
Старый 23.01.2023, 20:32   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от FPaul Посмотреть сообщение
Не силён во вставках, поэтому алгоритм покажу полностью на ассемблере masm32
Только это не вставка. Это программа на fasm, которая сцепляется с программой на C++.

Судя по всему автору темы надо было именно так сделать. Чтобы программы на ассемблере и на C++ были объединены в одном бинарном файле.

ADD: Вам так нравятся лишние команды в циклах

Код:
mov     eax,    12345
        mov     edi,    10
        lea     ecx,    [esp - 4]
        @@:
                xor     edx,     edx
                div     edi
                push    edx
                test    eax,     eax
        jnz     @b
        mov     eax,    [ecx]
        mov     ebx,    [esp]
        mov     [esp],  eax
        mov     [ecx],  ebx
        @@:
                mul     edi
                add     eax,    [esp]
                pop     edx
                cmp     esp,     ecx
        jbe     @b

Последний раз редактировалось macomics; 23.01.2023 в 20:41.
macomics вне форума Ответить с цитированием
Старый 23.01.2023, 20:45   #10
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Да, оговорился...

Мне интереснее было алгоритм показать.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа в с++ (нахождение цифры в числе) 1Darya7 Помощь студентам 0 21.11.2018 23:09
Отсортировать цифры в числе по возрастанию DimaDynasty SQL, базы данных 9 21.09.2018 15:38
C# - Разбиение числе на цифры: des666sar Помощь студентам 4 13.09.2015 21:00
В данном целом числе N, заменить нулями все цифры стоящие на нечетных позициях в числе TsykunovDmitriy Паскаль, Turbo Pascal, PascalABC.NET 3 07.05.2014 22:21
Элементы массива и старшие цифры logistics Помощь студентам 4 22.04.2008 00:12