С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 18

Работа с TASM в С++, через cdecl

13.01.2013, 21:10. Показов 2100. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать функцию strcat на АСМе, при этом писать в MSVS 2008 сишный код с вызовом АСМа через cdecl-соглашение.
Наработка есть, но при запуске не выдает нужного значения, после выхода вылетает с переполнением стека.

C++
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
// laba4.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include  <iostream>
using namespace std;
#include <conio.h>
 
 
//Использует соответствующие соглашения о передачи параметров
extern "C"
{
    char __stdcall my_strcat(char* a, char* b);
}
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    char string[128];
    char result;
    char string1[128];
    
 
    //Ввод строки в предварительно выделенный массив
    cout<<"Input string: ";
    cin>>string;
    cout<<"Input second string: ";
    cin>>string1;
 
    result=my_strcat(string,string1);
    
        cout<<endl<<"Result: "<<result<<endl;
    
    _getch();
    return 0;
}
и сам ассемблер
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
.386
.model flat
.data
 
    symend dd '$'
    compare dd ?
    len1 dd ?
    len2 dd ?
 
.code
 
_my_strcat@8 proc near
    push ebp            ; Пролог процедуры
    mov ebp,esp
    ;push edi
     
                        ; Определение параметров процедуры
    string equ dword ptr [ebp+8]
    string2 equ dword ptr [ebp+12] 
        
    push string                 ; Заносим 1 строку в EBX
    mov ebx, string             ;
    call _strlen                ; чтобы вычислить длину строки
    mov len1,eax
    add esp, 4
        
                    
    push string2                    ; Заносим 2 строку в EBX
    mov ebx, string2
    call _strlen                ; чтобы вычислить длину строки
    mov len2,eax    
    add esp,4
    
    
    mov ecx,len1
    lea si,compare
    lea di,string                   ;   
    cld
    rep movsb
    
    
    mov ecx,len2
    jcxz END_PROC
    ;push eax
    lea edi,string2
    ;lea esi,string 
 
    cld
    rep movsb
    xor ebx,ebx
    ;pop    ebx
    mov ebx, len2
    ;mov eax, symend
    mov word ptr [edi+ebx],'$'
    ;lea edi,symend
    ;mov ecx,1
    ;rep movsb
     
 
 
 
    
    
    xor eax,eax
    mov eax,edi
    
    
END_PROC:
    pop edi             ; Эпилог процедуры
    mov esp,ebp
    pop ebp
    ret 8
_my_strcat@8 endp
 
 
_strlen proc
    push ebx                    ; Пролог
                                ; Сохраняем регистр EBX в стеке
        
   xor eax,eax                  ; Обнуляем EAX
str_loop: 
   cmp word ptr [ebx],0     ; Проверяем на конец строки
    je str_end                  ; Если конец строки, то выходим из процедуры
    inc eax                     ; иначе увеличиваем длину строки на 1
    inc ebx                     ; и увеличиваем адрес на 1 (т.е. перейдем к след. элементу)
    jmp str_loop                ; Перейдем к началу цикла
str_end:
                                ; Эпилог
    pop ebx                     ; Восстанавливаем регистр EBX
    ret                         ; Возвращаемся из процедуры
_strlen endp
 
 
 
 
 
public _my_strcat@8
end
Если есть возможность, переделать этот код. Если легче - подкинуть идейки для рабочего....

з.ы. скрин ошибки:
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2013, 21:10
Ответы с готовыми решениями:

[variadic pack][cdecl]
доброе утро. рассмотрим код: http://rextester.com/ATJJT68666 #include &lt;iostream&gt;

Является ли введённая строка правильной записью целого шестнадцатеричного числа
Прошу попомощи.Никак не разобрать задание. 1. Определить, является ли введённая строка правильной записью целого шестнадцатеричного...

Посчитать количество разных символов в строке
Здравствуйте! Подскажите как в TASM реализовать введение строки и вывод ее, строку нужно вводить не посимвольно, а сразу! нужно...

2
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 18
15.01.2013, 23:51  [ТС]
Я, конечно, всё понимаю, но такой игнор.... Стыдно, господа....
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
16.01.2013, 00:58
Цитата Сообщение от Romantiqqq Посмотреть сообщение
Стыдно, господа...
Стыдно, сударь, когда видно. А ваши ошибки лежат на виду - стр 22 и 30.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2013, 00:58
Помогаю со студенческими работами здесь

Изменить первую и последнюю буквы строки в прописные, а все остальные прописные на строчные
Есть текст программы не могу понять как в ней определяется длинна вводимой строки, для чего директива LABEL BYTE, почему MAXLEN DB ...

Вывести на экран только слова содержащие шаблон
Задание: 1.Ввести с клавиатуры коротенькую строку- шаблон. Найти шаблон во введенной строке. Вывести на экран только слова содержащие...

Дополнить каждую строку файла символами "**" и записать в новый файл
Помогите пожалуйста, проепод по ассемблеру в начале семестра заболел на 5 недель, и в итоге все проги не успеваю написать в срок. Задание...

Создать новую строку, в которой заданное слово будет заменено на другое заданное слово
Прошу помощи с заданием! Второй день никак не могу сделать. Создать новую строку, в которой заданное слово будет заменено на другое...

Работа с tasm под Windows
У меня проблоема с компилятором, а именно с его отсутствием. Я пишу код в обычном блокноте, а чем компилировать, понятия не имею. Скачал...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю 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
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru