Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
1

Можно ли реализовать перегруженную функцию на masm?

10.12.2015, 00:21. Просмотров 325. Ответов 14
Метки нет (Все метки)

Добрый вечер. Подскажите, можно ли реализовать перегруженную функцию на MASM? В оптимале - при помощи C++ перегрузить и юзать. Цель - вывод различных данных на экран(целое число, строка, поля структуры).
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2015, 00:21
Ответы с готовыми решениями:

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

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

Перегруженную функцию переделать в виртуальную
Сам как не знаю сделать пожалуйста помогите)) Есть перегруженная функция, нужно сделать из нее...

Класс Integer и опредлить перегруженную функцию
Здравстуйте у меня вот такое задание: Создать класс целых чисел integer. Определить перегруженную...

Указатель на перегруженную функцию по шаблонному параметру
Допустим, у меня есть перегруженная функция func с одним параметром. Как написать шаблонную...

14
Mikl___
Автор FAQ
13728 / 6476 / 646
Регистрация: 11.11.2010
Сообщений: 11,697
10.12.2015, 03:16 2
Minchanin-Bel,
собери программу в С++, а потом через встроенный в С++ отладчик посмотри, как реализуется перегруженная функция
1
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 16:09  [ТС] 3
Немного не по теме, но, дабы не создавать еще одну тему:

Как вывести на консоль строку? Если она заканчивается не на $

MASM

Assembler
1
2
3
4
5
6
7
8
print@line proc line:DWORD
    mov esi, line
    mov ah, 9
    mov edx, line
    int 21h
    mov eax, 1
    ret 1
print@line endp
Добавлено через 7 минут
Ответ на мой вопрос:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
print@line proc line:DWORD
    push -11
    call GetStdHandle
    mov esi, line
    mov edi, -1
 
    COUNTER:
        inc edi
        cmp byte ptr [esi+edi], 0
        jne COUNTER
 
    push 0
    push 0
    push edi
    push line
    push eax
    call WriteConsoleA
    mov eax, 1
    ret 1
print@line endp
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 16:58 4
Вывод ASCIZ-строки, ДОС:
Assembler
1
2
3
4
5
6
7
8
9
print@line proc line:DWORD
    mov esi, line
@1: lodsb
    or  al, al
    jz  @2
    int 29h
    jmp @1
@2: ret
print@line endp
А под виндой проще всего вызвать crt_puts или crt_printf из msvcrt.dll, примеры здесь есть.
1
10.12.2015, 16:58
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 17:01  [ТС] 5
Из Visual studio выбивает на INT 29h
Так же и на 21h
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 17:07 6
Естественно, ведь VS заточена только под винду. Поэтому и не слезаю с OpenWatcom'a, компилятор которого способен генерить код под DOS/win16/win32/UNIX/OS/2/Netware в одном флаконе.
0
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 17:20  [ТС] 7
Ну вот я пока-что так) Если затянет - буду пробовать нечто другое, разумеется)

Не подскажите, как вывести десятичное число, принимаемое в функцию по адресу? Как понимаю, в цикле делить на 10, а затем в обратном порядке выводить, но не могу сообразить, как... Или как-то проще можно?

Добавлено через 9 минут
P.S. Да, я вижу тысячи тем с подобным вопросом и уймы решений. Но, ничего не выходит организовать, пока что... Помогите пожалуйста, совсем как-то с числами все туго получилось.
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 17:31 8
Общее решение прилеплено http://www.cyberforum.ru/assembler/thread54461.html
1
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 18:03  [ТС] 9
Видел, читал, но int 21h... Эх, готового решения не найти под мою ситуацию, похоже, но спасибо.
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 18:14 10
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
Эх, готового решения не найти под мою ситуацию
ORLY?
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
; eax - signed long
_cputl:
;;;        push ebx
    mov ebx, eax
    neg ebx
    cmovs   ebx, eax
    js  @F
    mov al, '-'
    int 29h
@@: mov eax, ebx
;;; pop ebx
 
; eax - unsigned long
 
_cputul:
;;; pushad
    xor ecx, ecx
    mov ebx, 0Ah
    xor esi, esi
    xor edi, edi
@@: xor edx, edx
    inc ecx
    idiv    ebx
    shld    edi, esi, 4
    shl esi, 4
    or  si, dx
    test    eax, eax
    jnz @B
    mov edx, esi
@@: mov al, dl
    and al, 0fh
    or  al, 30h
    shrd    edx, edi, 4
    shr edi, 4
    int 29h
    loop    @B
;;; popad
    ret
1
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 18:42  [ТС] 11
1>stl.asm(183): error A2085: instruction or register not accepted in current CPU mode
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 18:49 12
Дык, если поставить директиву .686 в первой строчке, то должно пройти.
0
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 18:53  [ТС] 13
Цитата Сообщение от Charles Kludge Посмотреть сообщение
должно
Поставил, уже лучше, но..
int 29h

Прям напасть какая-то с этими "int"
0
Charles Kludge
Клюг
7648 / 3163 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.12.2015, 18:58 14
Дык, я писал под ДОСю, под виндой не вижу проблем, см. пост №4.
0
Minchanin-Bel
5 / 5 / 3
Регистрация: 19.09.2010
Сообщений: 173
10.12.2015, 19:57  [ТС] 15
Ладно уж, спасибо Вам

Может подскажете, как, принимая два адреса, записать значение одного в другой?

Странное для меня - в eax оказывается адрес W_load... А нужно значение

Assembler
1
2
3
4
5
6
7
8
set_load proc W_machine:DWORD, W_load:DWORD
    mov esi, W_machine
    add esi, 256
    mov eax, [W_load]
    mov [esi], eax
    mov eax, 1
    ret
set_load endp
Доп:

Assembler
1
2
3
4
5
6
beginload dd 6
beginmachine wash <"cotton", 4, 90, 140, 1000>
;
push offset beginload
push offset beginmachine
call set_load
Добавлено через 3 минуты
А подобное отработало как надо! Почему?

Assembler
1
2
3
4
5
6
7
8
9
set_load proc W_machine:DWORD, W_load:DWORD
    mov esi, W_machine
    add esi, 256
    mov eax, [W_load]
    mov ebx, [eax]
    mov [esi], ebx
    mov eax, 1
    ret
set_load endp
0
10.12.2015, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2015, 19:57

Как переопределить перегруженную функцию в производном классе?
Как переопределить перегруженную функцию в производном классе? #include &lt;iostream&gt; class Number {...

Не могу создать указатель на перегруженную функцию-член класса
Есть функция монстр из vulkan api. Она является членом класса. Просто написать её название не...

Создать перегруженную функцию для вывода нечетных элементов массива
Сделать через перегруженную функцию: Задан массив целых чисел. Вывести на экран элементы,...


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

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

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