С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 04.05.2019
Сообщений: 5
GAS/AT&T

Возведение числа в степень

04.05.2019, 10:35. Показов 7486. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В этом задании вы должны написать функцию возведения в степень. Функция принимает число в регистре %eax и показатель степени в регистре %edx, и возвращает результат в регистре %eax. Для выполнения этого задания вам потребуются следующие инструкции:
push %register и pop %register - если вы будете использовать регистры кроме %eax и %edx, то воспользуйтесь этой парой инструкций чтобы сохранить значение этих регистров в начале функции, а потом восстановить в конце (помните, что восстанавливать нужно в обратном порядке - так работает стек).
- imul %src, %dst - эта инструкция умножает значения в регистрах %src и %dst и сохраняет результат в регистре %dst
- test %register, %register - эта инструкция проверяет равно ли нулю значение в регистре %register и устанавливает специальный флаг ZF, если это так
- jz branch - эта инструкция передает управление метке branch, если инструкция test установила флаг ZF (используйте ее в паре с test).
- dec %register - эта инструкция уменьшает значение в регистре %register на 1
- ret - инструкция завершает функцию, т. е. достает со стека адрес возврата и передает туда управление (чтобы достать со стека правильный адрес возврата, стек должен находится в таком же состояние, как и в самом начале функции)

Несколько дней мучаюсь, выдает все время одну ошибку - превышен лимит времени. В чем проблема и как исправить ума не приложу
Миниатюры
Возведение числа в степень  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2019, 10:35
Ответы с готовыми решениями:

Возведение числа в степень
Сижу на экзамене, надо решить прогу у=2 в степени 3.1 помогите пожалуйста)) заранее спасибо!!!

Возведение заданного целое числа в целую неотрицательную степень, используя минимум операций умножения
Задание: Возведите заданное целое число в целую неотрицательную степень, используя минимальное число операций умножения. вот что я...

Возведение в степень
Доброго времени суток. Имеется число 3.3 например. Нужно его возвести в степень 0.45. Как реализовать? Есть специальная команда...

6
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.05.2019, 15:40
Вычисление n-ной степени числа

Добавлено через 1 минуту
Алгоритмы быстрого возведения в степень
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8652 / 4487 / 1669
Регистрация: 01.02.2015
Сообщений: 13,893
Записей в блоге: 12
04.05.2019, 17:10
Lika_Chan, я плохо понимаю синтаксис AT&T, а что в строке 3 происходит?
Assembler
3
mov $0*1, %edx
Это не загрузка нуля в регистр?

Добавлено через 3 минуты
И само вычисление степени не правильное - вы на каждой итерации модифицируете eax и уже на второй итерации получаете не 2, а 4 степень числа.

И было бы неплохо проверять в начале edx на равенство 0.

Т.е. посмотрите на алгоритмы вычисления степени, о которых упомянул murderer.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,301
Записей в блоге: 12
10.05.2019, 19:29
Lika_Chan, вас не смущает, что вы умножаете число само на себя, а потом результат сам на себя (а не на исходное число)?
Типа такого:
2*2=4 ; 4*4 = 16 ; 16*16 = 256 ; 256*256 = 65536 ; 24 = 65536 ?

Разбирайтесь и переводите в AT&T (там есть версия для Linux, для 32 битов надо заменить rax на eax и т.п.):
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
format  PE64 Console 5.0
include 'win64axp.inc'
 
LINUX_VERSION   =       0
 
;-- CODE SECTION -------------------------------------------------------------------------------------------------------
 
.code
 
entry:
 
frame
                cld
                mov     rbx,Numbers
        @@:
                mov     rdi,[rbx]
                mov     rsi,[rbx+8]
 
        if LINUX_VERSION
                push    rdi
                push    rsi
                call    IntPowerLinux
                pop     rsi
                pop     rdi
        else
                stdcall IntPower, rdi, rsi
        end if
                jc      .overflow
 
                cinvoke printf, <'%llu ^ %llu = %llu',10>, rdi, rsi, rax
                jmp     .continue
        .overflow:
                cinvoke printf, <'%llu ^ %llu = overflow! :(',10>, rdi, rsi
        .continue:
                add     rbx,16
                cmp     rbx,NumbersEnd
                jb      @B
 
                invoke  ExitProcess, 0
endf
 
; Power for unsigned integer base and exponent (Windows x64 version)
; returns: rax=x^y, cf=0 if ok || rax=undefined, cf=1 if overflow
if used IntPower
IntPower:       ; rcx = x (base), rdx = y (exponent)
                mov     eax,1           ; result (rax = 1)
                test    rdx,rdx
                jz      .exit           ; return 1 if y == 0 (cf = 0)
 
                mov     r8,rdx          ; move y to r8 (rdx will be destroyed after 'mul')
        .loop:
                shr     r8,1            ; y >>= 1, cf = shifted lower bit
                jnc     @F              ; don't multiply result by x if cf = 0
 
                mul     rcx             ; result *= x
                jc      .exit           ; exit if overflow (cf = 1)
        @@:
                test    r8,r8
                jz      .exit           ; repeat while y != 0 (cf = 0)
 
                xchg    rax,rcx
                mul     rax             ; x *= x
                xchg    rax,rcx
                jnc     .loop           ; exit if overflow (cf = 1), repeat otherwise
        .exit:
                ret
end if ; used IntPower
 
; Power for unsigned integer base and exponent (Linux x64 version)
; returns: rax=x^y, cf=0 if ok || rax=undefined, cf=1 if overflow
if used IntPowerLinux
IntPowerLinux:  ; rdi = x (base), rsi = y (exponent)
                mov     eax,1           ; result (rax = 1)
                test    rsi,rsi
                jz      .exit           ; return 1 if y == 0 (cf = 0)
        .loop:
                shr     rsi,1           ; y >>= 1, cf = shifted lower bit
                jnc     @F              ; don't multiply result by x if cf = 0
 
                mul     rdi             ; result *= x
                jc      .exit           ; exit if overflow (cf = 1)
        @@:
                test    rsi,rsi
                jz      .exit           ; repeat while y != 0 (cf = 0)
 
                xchg    rax,rdi
                mul     rax             ; x *= x
                xchg    rax,rdi
                jnc     .loop           ; exit if overflow (cf = 1), repeat otherwise
        .exit:
                ret
end if ; used IntPowerLinux
 
;-- DATA SECTION -------------------------------------------------------------------------------------------------------
 
.data
 
; Pairs of base and exponent
Numbers         dq      0, 0
                dq      0, 1 shl 63
                dq      1, 0
                dq      1, 0xFFFFFFFFFFFFFFFF
                dq      7, 3
                dq      10, 10
                dq      3, 19
                dq      21, 13
                dq      987654, 3
                dq      1357986420, 2
                dq      9876543210123456789, 0
                dq      9876543210123456789, 1
                dq      9876543210123456789, 2
                dq      7, 77
                dq      127, 9
                dq      128, 9
                dq      138, 9
                dq      139, 9
                dq      255, 8
                dq      256, 8
                dq      255, 255
                dq      9876543210123456789, 1234567890987654321
NumbersEnd:
 
;-- IMPORT SECTION -----------------------------------------------------------------------------------------------------
 
section '.idata' import data readable
 
library kernel32, 'kernel32.dll',\
        msvcrt, 'msvcrt.dll'
 
        import_kernel32
        all_api
 
import  msvcrt,\
        printf, 'printf'
0
10.05.2019, 20:26

Не по теме:

Jin X, а что за автотестер у топикстартера?

0
10.05.2019, 23:09

Не по теме:

ФедосеевПавел, не знаю. Вероятно, какой-то тренажёр типа codewars.com.
Или, может, он участвует в каком-то соревновании (за какие-то плюшки) :))
Ну или это предварительная проверка лабы в ВУЗе. В продвинутых ВУЗах есть автоматизированные тесты, которые нужно пройти перед сдачей преподу (загружается исходник, на сервере компилируется, запускается с разными входными параметрами, проверяется результат).

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Это не загрузка нуля в регистр?
Да, именно она и есть. В AT&T приёмник и источник переставлены, константы предваряются $, а обычные числа обозначают адрес. Конструкции типа mov byte [eax+edx*4-16],0 записываются как movb $0, -16(%eax,%edx,4). Изврат, короче (хотя movb удобнее, чем mov byte)...

0
11.05.2019, 01:52

Не по теме:

Jin X, спасибо.

Почему-то надеялся, что это широкоизвестный автотестер.

Про загрузку 0 в edx у топикстартера спрашивал в качестве наводящего вопроса - тот код будет выполняться независимо ни от чего 4*10^9 раз, а это может превысить по времени 5с. Но плохо понимал синтаксис и подозревал, что "$0*1" это какой-нибудь макрос или обозначение передаваемого параметра во встроенный ассемблер.

Теперь буду знать, что это константа.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2019, 01:52
Помогаю со студенческими работами здесь

Сопроцессор, возведение в степень
mov ax, @data mov ds, ax lea dx, m1 mov ah, 09 ; на ввод n int 21h mov ah, 10 lea dx, bf int 21h ...

Умножение(возведение в степень)
Доброго времени суток! Возник такой вопрос.. по условию задания нужно найти значение выражения, в котором содержится A^3 A задана 1...

Возведение в степень чисел
Помогите пожалуйста ребят Вычислить квадраты чисел от 1 до 10 (Tasm)

Возведение в степень FPU
Подскажите, пожалуйста, как выглядит код возведения X в степень Y? Второе сообщение в этой теме...

Возведение в степень с минимальным количеством операций умножения
Нужно написать программу, которая возводит целое неотрицательное число в целую неотрицательную степень с минимальным количеством операций...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru