Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 9
1

Переделать strcpy в strcat на Tasm

19.11.2012, 19:13. Показов 3992. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста помогите.TASM
Есть написанная функция strcpy.Нужно переделать ее в strstr .
[ASM].386; Директива компиляции инструкций для 386 процессора

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
; Определение публичных и внешних имен
public _my_strcpy
extern _strlen:near
 
.model flat
.code
 
_my_strcpy proc near
    push ebp                      ; Пролог процедуры
    mov ebp,esp
    
                              ; Определение параметров процедуры
    str1 equ [ebp+8]
    str2 equ [ebp+12] 
    
    cld
    
    push str1               ; Передача параметра для функции через стек
    call _strlen            ; Определение длины строки
    add esp,4               ; Очистка параметров
    mov ecx,eax             ; Cохранение длины строки
    
    mov esi,str1            ; Адрес основной строки в источник
    push str2                 ; Передача параметра для функции через стек
    mov  edi, str2          ; Адрес подстроки в приемник
 
    rep movsb                   ; Копирование строк
    mov eax,00h
    stosb   
          
                              ; Эпилог процедуры
    mov esp,ebp
    pop ebp
    ret
_my_strcpy endp
End





Текст программы на C++:
C++ (Qt)
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
#include "stdafx.h"
#include  <iostream>
using namespace std;
#include <conio.h>
 
//Функции копирования строки
//Использует соответствующие соглашения о передачи параметров
extern "C"
{
    char* _cdecl my_strcpy(char* str1, char* str2);
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    char str1[128], str2[128];
 
    //Ввод строки в предварительно выделенный массив
    cout<<"String: ";
    cin>>str1;
    
    //Вывод результата копирования
    my_strcpy(str1,str2);
    cout<<endl<<"Result is: "<<str2<<endl;
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2012, 19:13
Ответы с готовыми решениями:

функция strcpy и strcat
Добрый день!У меня такая проблема...Есть массив строк, где хранятся имена и при выводе имени на экран,если оно длиннее определенного,то я...

В чем разница между функциями strcat() и strcpy()?
В чем разница между функциями strcat() и strcpy()?

Реализовать собственные функции strcat, strcpy, strcmp, strlen
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции strcat, strcpy, strcmp, strlen. Для strlen реализовал, а...

9
Клюг
 Аватар для Charles Kludge
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
19.11.2012, 20:49 2
Цитата Сообщение от Xasol
переделать strcpy в strcat
Цитата Сообщение от Xasol
переделать ее в strstr
Эмм... Может вы определитесь, что именно, поиск подстроки или конкатенация?
0
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 9
19.11.2012, 21:15  [ТС] 3
Извините опечатался. Нужно переделать в strcat
0
Клюг
 Аватар для Charles Kludge
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
19.11.2012, 23:33 4
Ну вот как-то так.
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
.386
;tasm /m3 /mx my_strct.asm
.model  flat,C
.code
; Определение публичных и внешних имен
public  my_strcat
 
my_strcat   proc C, str1:DWORD, str2:DWORD
    mov edi, str1
    call    @eos
    push    edi         ; EDI -> end-of-str1
    mov edi, str2
    mov esi, edi
    call    @eos
    not ecx         
    pop edi
; EDI -> end-of-str1
; ESI -> str2
; ECX = strlen(str2)
    rep movsb           ; Копирование строк
    xor al,al
    stosb
    mov eax, str1       ; due to ANSI C requirements
    ret
; Определение хвоста ASCIZ-строки  ES:EDI -> str
; побочный эффект: ECX - отрицательная длина строки ;)
@eos:   
    xor ecx,ecx
    mov al,cl
    dec ecx
    repne   scasb
    dec edi
    db  0C3h    ;ret опкодом, иначе аццкий ТАСМ вставит 
            ; перед ret leave, что нафиг не надо
 
my_strcat   endp
    End
Тестилка:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
#include <stdio.h>
 
extern char* _cdecl my_strcat(char* str1, char* str2);
 
void main(void)
{
    char str1[128], str2[128];
 
    //Ввод строки в предварительно выделенный массив
    puts("String1:");
    gets(&str1);
    puts("String2:");
    gets(&str2);
    my_strcat(&str1,&str2);
    puts(&str1);
    _getch();
}
1
0 / 0 / 0
Регистрация: 04.11.2012
Сообщений: 9
25.11.2012, 18:50  [ТС] 5
Спасибо большое. А не можете объяснить что делается на метке
Assembler
1
2
3
4
5
6
7
8
@eos:   
    xor ecx,ecx
    mov al,cl
    dec ecx
    repne   scasb
    dec edi
    db  0C3h    ;ret опкодом, иначе аццкий ТАСМ вставит 
            ; перед ret leave, что нафиг не надо
0
Клюг
 Аватар для Charles Kludge
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
25.11.2012, 19:23 6
Цитата Сообщение от Xasol
что делается на метке
Да ничего особенного:
Assembler
1
2
3
4
5
6
7
8
9
10
; Определение хвоста ASCIZ-строки  ES:EDI -> str
@@eos:  
    xor ecx,ecx ;; cx = 0
    mov al,cl   ;; al = 0
    dec ecx     ;; cx = -1 - эта конструкция короче и быстрее, чем
            ;; mov ecx, 0FFFFFFFFh и mov al,0
    repne   scasb   ; ищем первый байт 00 в  ES:EDI, т.к. это Си, 
; он там обязательно будет, проверкой себя можно не утруждать.
;в итоге not(ECX) = длина строки
    dec edi ; ES:EDI -> на байт за 00, поэтому edi уменьшаем.
1
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 18
13.01.2013, 19:35 7
Bash
1
2
3
4
Ошибка    2   error C2664: gets: невозможно преобразовать параметр 1 из 'char (*__w64 )[128]' в 'char *'    laba4\laba4main.cpp 14  laba4
Ошибка    3   error C2664: gets: невозможно преобразовать параметр 1 из 'char (*__w64 )[128]' в 'char *'    laba4\laba4main.cpp 16  laba4
Ошибка    4   error C2664: my_strcat: невозможно преобразовать параметр 1 из 'char (*__w64 )[128]' в 'char *'   laba4\laba4main.cpp 17  laba4
Ошибка    5   error C2664: puts: невозможно преобразовать параметр 1 из 'char (*__w64 )[128]' в 'const char *'  laba4\laba4main.cpp 18  laba4
Вот такие вот ошибки выдает при компиляции. Компилю на MSVS 2008
0
Клюг
 Аватар для Charles Kludge
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.01.2013, 19:50 8
Писалось под Open Watcom C32 Optimizing Compiler Version 1.8, ком. строка такая:
Code
1
wcl386  -hw -5s -d2 -D_WIN32 -bcl=nt -s -sg -ox %1 %2 %3 %4 %5
Так что вышивальная студия отдыхает.
0
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 18
13.01.2013, 20:39 9
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Писалось под Open Watcom C32 Optimizing Compiler Version 1.8, ком. строка такая:
Code
1
wcl386  -hw -5s -d2 -D_WIN32 -bcl=nt -s -sg -ox %1 %2 %3 %4 %5
Так что вышивальная студия отдыхает.
Вопрос в следующем - что здесь нужно переделать, чтобы под этой самой "вышивальной студией" заработало?
0
Клюг
 Аватар для Charles Kludge
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.01.2013, 20:52 10
Консольная выньНТ-задача, 32 бита(х86), с отладкой, под третий пень, стековая модель передачи параметров, без проверки стека на переполнение, полная оптимизация.
Студио не знаю, уж извиняйте...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2013, 20:52
Помогаю со студенческими работами здесь

Что лучше применить: sprintf или strcat и strcpy?
Win7, CodeBlocks, C++, Win32 API, ResEd. Писал программу, использовал sprintf(cVar1, &quot;%s&quot;, cVar2) и sprintf(cVar1, &quot;%s%s&quot;,...

Для класса String перегрузить функции strcpy, strcat
Подскажите пожалуйста, не пойму само задание из Дейтела. Изучаю главу перегрузки операций. &quot;Изучите функции библиотеки...

Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки)
вот задание: Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat из стандартной библиотеки cstring (string.h). ...

Посчитать количество нулей, в двойном слове
Здравствуйте уважаемые обитатели данного форума. Так вышло, что мне нужна ваша помощь. Если есть желающие буду рад, принять вашу помощь. И...

из masm в tasm кто может переделать
;Program to Find all the 3 digit integers which ;equal the sum of the cubes of their digits .MODEL SMALL .STACK 200H .DATA ...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH 1. поймать путь через вывод $(pwd) 2. более правильно - на основе realpath (см. скриншот)
Django или Flask: что выбрать для веб-разработки на Python
py-thonny 13.03.2025
Django – это высокоуровневый фреймворк, который придерживается философии "всё включено". Он предоставляет разработчику готовые решения для большинства типичных задач веб-разработки: от аутентификации. . .
Непрерывное развертывание в Java с Kubernetes
Javaican 13.03.2025
Чем так привлекателен Kubernetes для развертывания Java-приложений? Этот оркестратор контейнеров позволяет автоматизировать развертывание, масштабирование и управление контейнеризированными. . .
Предотвращение XSS, CSRF и SQL-инъекций в JavaScript
run.dev 13.03.2025
JavaScript занимает первые позиции среди языков веб-разработки, но его распространенность делает его привлекательной целью для злоумышленников. Межсайтовый скриптинг (XSS), межсайтовая подделка. . .
PHP 8: JIT-компиляция и улучшение производительно­сти
Jason-Webb 13.03.2025
PHP никогда не славился своей скоростью. Многие сталкивались с проблемами производительности при работе со сложными вычислениями или обработкой больших объемов данных. Традиционная модель выполнения. . .
Сериализация данных с Apache Avro в Kafka
Javaican 12.03.2025
Apache Kafka стала одним из ключевых решений для работы с большими потоками данных. Однако с ростом объемов передаваемых данных возникает проблема: как эффективно сериализовать и десериализовать. . .
Создание потребителей Kafka с помощью Reactor Kafka
Javaican 12.03.2025
Reactor Kafka — это библиотека, объединяющая Apache Kafka с реактивным программированием на базе Project Reactor. Такое сочетание позволяет строить неблокирующие, асинхронные приложения с контролем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru