Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 2 / 0
Регистрация: 12.12.2016
Сообщений: 77
NASM

Пояснения по чужим решениям одного того же задание (почему решения настолько разные)

10.09.2019, 06:14. Показов 1033. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
решение от
Unnamed самое кроткое

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
global string_repeat
extern malloc, memcpy, strlen
section .text
string_repeat:
                push    rbx
                push    rbp
[B]                push    rax
                push    rax[/B]
                push    rsi
                mov     rbx, rdi
                mov     rbp, rsi
                mov     rdi, rsi
                call    strlen
                mov     rbp, rax
                mul     rbx
                lea     rdi, [rax + 1]
                call    malloc
                mov     [rsp + 16], rax
                test    rbx, rbx
                jz      .done
.loop:          mov     rdi, rax
                mov     rsi, [rsp]
                mov     rdx, rbp
                call    memcpy
                add     rax, rbp
                dec     rbx
                jnz     .loop
.done:          mov     byte [rax], 0
                pop     rcx
                pop     rcx
                pop     rax
                pop     rbp
                pop     rbx
                ret
зачем пушить рах дважды?

решение от
monadius

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
SECTION .text
extern malloc, strlen, memcpy
global string_repeat
 
;  Returns a string repeated arg1 times.
;  Note: Please return a pointer to the new string which was allocated by C's malloc.
;  arg0         = (size_t)      The number of times to repeat.
;  arg1         = (const char*) The original string.
;  return value = (char*)       New string which holds the value of arg0 repeated arg1 times.
string_repeat:
  push rbx  ; = original string
  push r12  ; = number of times to repeat
  push r13  ; = length of the original string
  push r14  ; = output pointer
  push r15  ; = output buffer
  mov rbx, rsi
  mov r12, rdi
  mov rdi, rsi
  call strlen
  mov r13, rax
  mul r12
  inc rax
  mov rdi, rax
  call malloc
  mov r15, rax
  mov r14, rax
  test r12, r12
  jz .end
.loop:
  mov rdi, r14
  mov rsi, rbx
  mov rdx, r13
  call memcpy
  add r14, r13
  dec r12
  jnz .loop
  mov rax, r15
.end:
  mov byte [r14], 0
  pop r15
  pop r14
  pop r13
  pop r12
  pop rbx
  ret
что в регистрах р12-15 может быть изначально?

Добавлено через 2 минуты
Gena2018115rus

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
SECTION .text
global string_repeat
extern calloc, strlen, strcat
 
extern puts, putchar
 
;  Returns a string repeated arg1 times.
;  Note: Please return a pointer to the new string which was allocated by C's malloc.
;  arg0         = (size_t)      The number of times to repeat.
;  arg1         = (const char*) The original string.
;  return value = (char*)       New string which holds the value of arg0 repeated arg1 times.
string_repeat:
  cmp rsi, 0
  je zero
  
  push rdi
  push rsi
  add rdi, 48
  call putchar
  pop rsi
  pop rdi
  
  
  push rdi
  push rsi
  mov rdi, rsi
  call puts
  pop rsi
  pop rdi
  cmp rdi, 0
  jne ok1
zero:
  mov rdi, 1
  mov rsi, 1
  call calloc
  ret
ok1:
  cmp byte [rsi], 0
  je zero
  push rdi           ; положили число на стек
  mov rdi, rsi       ; исходная строка в первый аргумент
  call strlen        ; вызвали strlen
  pop rdi            ; прочитали число обратно
                     ; теперь в rax длина исходной строки
  push rax
  
  push rsi           ; положили исходную строку на стек
  push rdi           ; положили число на стек
  mul rdi            ; умножили длину исходной строки на число
                     ; теперь в rax длина ответа
  inc rax            ; теперь в rax длина нольтерм. ответа (, а на стеке число и исходная строка)
  
  mov rdi, rax       ; в первый аргумент длина нольтерм. ответа
  mov rsi, 1         ; во второй аргумент sizeof(char)
  call calloc        ; вызвали calloc
                     ; теперь в rax ответ (, а на стеке число и исходная строка)
  
  pop rbx            ; в rbx число
  pop rsi            ; в rsi исходная строка
  mov rdi, rax       ; в rdi ответ
  pop rcx            ; в rcx длина исходной строки
  push rdi
  
loopp:
  cmp rbx, 0
  jng return         ; если нет, то выходим из цикла
  
  push rdi
  push rcx
  push rsi
  call strcat        ; если да, то вызываем strcat
  pop rsi
  pop rcx
  pop rdi
  add rdi, rcx
  dec rbx            ; --число
  jmp loopp          ; в начало цикла 
  
return:
  pop rdi
  push rdi
  call puts
  pop rdi
  mov rax, rdi
  ret
тут относительно понятно, но решение слишком больгшое

Добавлено через 1 минуту
lucic71 самое лучшее решение??

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
SECTION .text
global string_repeat
extern malloc
 
;  Returns a string repeated arg1 times.
;  Note: Please return a pointer to the new string which was allocated by C's malloc.
;  arg0         = (size_t)      The number of times to repeat.
;  arg1         = (const char*) The original string.
;  return value = (char*)       New string which holds the value of arg0 repeated arg1 times.
string_repeat:
 
  ; if 'count' is 0 then return address to a null byte
  cmp rdi, 0
  jne .ok
  mov rdi, 1
  call malloc
  mov [rax], byte 0
  ret
  
.ok:
 
  ; calculate length of string
  push rsi 
  call string_length
  pop rsi
  
  ; preserve the registers because they will be
  ; affected by 'malloc' subroutine
  push rdi
  push rcx
  push rsi
  
  ; calculate number of bytes to allocate
  mov rax, rdi
  mul rcx
  mov rdi, rax
  inc rdi
  
  call malloc
  
  ; restore the registers
  pop rsi
  pop rcx
  pop rdi
  
  ; use rbx to loop through the string allocated by malloc
  mov rbx, rax
 
.ok.loop:
  ; save the registers for later
  ; rcx will be affected by 'loop' instruction
  ; rsi will be affected by 'lodsb' instruction
  push rcx
  push rsi
  
  xor rax, rax
  .ok.loop.string:
      ; write the 'str' string to memory
      lodsb
      mov [rbx], al
      inc rbx
      loop .ok.loop.string
      
   ; restore the registers
   pop rsi
   pop rcx
   
   ; do '.ok.loop' as many time as needed
   dec rdi
   jnz .ok.loop
   
   ; put string terminator at the end
   mov [rbx], byte 0
   ; rdx will store the base address of the string allocated by malloc
   ; we move it to rax in order to return from the function
   mov rax, rdx
   
   ret
 
  ret
  
string_length:
  ; loop through the string until we find a null character
  ; at the end we decrement rcx in order to get the length of the
  ; string without the null byte
  xor rcx, rcx
  xor rax, rax
  
.loop:
  lodsb; load byte from rsi
  inc rcx
  test al, al; check for null byte
  jnz .loop
  
  dec rcx; eliminate null byte
  ret
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2019, 06:14
Ответы с готовыми решениями:

Почему разные адреса одного и того же элемента динамического массива?
Я создаю динамический массив и отправляю его в функцию, если потом сравнивать адреса элементов массива в главной и вызываемой функции они...

Почему Windows настолько популярен, а линукс настолько обделен?
Откуда такая популярность у windows? Многие мои знакомые даже не догадываются про существование Linux... Почему все виндузятские ламеры...

Как наложить разные текстуры на разные грани одного и того же куба?
ЗДРАВСТВУЙТЕ! Подскажите пожалуйста как наложить разные текстуры на разные грани одного и тогоже куба?

3
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
10.09.2019, 16:34
зачем пушить рах дважды?
Видимо для выравнивания стека по границе 16 байт.
что в регистрах р12-15 может быть изначально?
Читай тут
R12:R15 Nonvolatile Must be preserved by callee
По соглашению о вызовах эти регистры нельзя изменять
lucic71 самое лучшее решение??
Зависит от критерия оценки. Нужен максимум скорости или минимальный размер кода? Копировать строку можно через rep movsb - это будет короче.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.09.2019, 17:03
Цитата Сообщение от murderer Посмотреть сообщение
Видимо для выравнивания стека по границе 16 байт.
rax - 64-е бита, о каком выравнивание может быть речь?

Нужно смотреть, не пару строк кода, а код целиком и как меняется стэк, скорее всего значение rax будет использовано ещё где-то другой функцией.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
10.09.2019, 23:49
Constantin Cat,
если адрес стека не кратен 16, то при вызове WinAPI функций программа может вылететь в астрал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2019, 23:49
Помогаю со студенческими работами здесь

Разные браузеры отдают разные html одного и того же сайта? по какому параметру это определяется?
К примеру сайт 1800contacts.com. В мозилле одна версия html, в chrome другая. Не могу понять. Многое перечитал уже. Может куку какую то...

Разные хеш-суммы после компиляции одного и того же проекта
Друзья! Подскажите, пожалуйста, почему один и тот же проект Qt компилируется по-разному? То есть у меня есть исходники, компилирую их и...

Связанная таблица может иметь разные названия одного и того же поля
БД access связывается с таблицей в формате .xlsx через запрос из этой таблицы берется поле Select Super. AS НаСК Екселевский...

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

Почему это вызывается из одного и того же потока
У меня есть объект в основном потоке при qDebug() << this.thread() выводит, допустим, 0x53ead8 объекту принадлежит QThreadPool и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru