Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444

Ответьте, пожалуйста на несколько вопросов по коду (разбираю код из книжки)

18.05.2011, 22:52. Показов 1228. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Кто может, ответьте, пожалуйста на несколько вопросов по коду (разбираю код из книжки):
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
 
DWORD lens(char *);
void cats (char *, char *, char *);
char a[] = "abcwwdfdfsdf";
char b[] = "1234";
//строка-буфер
char c[] = "";
int _tmain(int argc, _TCHAR* argv[])
{
    __asm
    {
        //вызов функции для слияния двух строк
        lea EAX, c//записываем адрес переменной с в регистр EAX
        push EAX
        lea EAX, b
        push EAX
        lea EAX, a
        ADD ESP, 12//почему 12, а не 3?? ведь аргументы - 3шт по одному байту? 
        //или как? или указатель - 4-байтовое число 
    }
    printf("%s\n", c);
    system("pause");
    return 0;
}
 
DWORD lens (char * s)
{
    DWORD l = 0;
    __asm
    {
        //задать направление сканирования (сбросить флаг DF)
        CLD//??????????????????????????????????????????????????
        //адрес строки в EDI
        mov EDI, s
        mov ESI, EDI
        //длина строки ограничивается максимальным 32-битным числом
        mov ECX, 0ffffffffH
        //будем искать 0
        xor AL, AL//зачем эта команда нужна???
        //сканировать пока не встретится 0
        REPNE SCASB
        //длина строки в EDI
        SUB EDI, ESI
        //исключить из длины терминальный символ
        dec ESI
        mov l, EDI
    }
    return l;
}
 
//функция слияния строк s1 + s2 -> s3
void cats(char * s1, char * s2, char * s3)
{
    __asm
    {
        //задать направление копирования
        CLD
            mov EDI, s3
            mov ESI, s1
            //определить длину строки s1
            push ESI
            call lens
            //освобождаем стек
            add ESP, 4
            //длина строки в ECX
            mov ECX, EAX//почему EAX, а не IDE?? ведь результат работы функции будет находиться в EDI???
            //скопировать s1->s3
            rep movsb
            mov ESI, s2
            //определить длину строки s2
            push ESI
            call lens
            //освобождаем стек
            add ESP, 4
            //длина строки в ECX
            mov ECX, EAX//почему EAX, а не IDE?? ведь результат работы функции будет находиться в EDI???
            //скопировать s2->s3
            rep movsb
            //фиксируем конец строки
            mov byte ptr [EDI], 0//по адресу, находящемусчя в EDI (адрес последнего символа+1, записываем символ конца строки
            //а где мы записывали адрес конца строки в EDI?????
    }
}
1. в функции main: ADD ESP, 12//почему 12, а не 3?? ведь аргументы - 3шт по одному байту?
//или как? или указатель - 4-байтовое число. И еще вопрос. зачем после call вызывать ADD ESP, 12?? Ведь в конце каждой функции мы пишем return а это по сути RET, то есть мы 2 раза очищаем стек? или я что-то не понял? поясните кто может, пожалуйста.
2. в функции lens: CLD//???????????????????????????????????????? ??????????что это делает??? поясните поподробней, пожалуйста
3. в функции lens:
//будем искать 0
xor AL, AL//зачем эта команда нужна??? - это-то понятно, что это аналог mov al, 0, который работает быстрее нежели mov, только зачем оно надо?зачем в al 0 загонять?
4. функция cats:
mov ECX, EAX//почему EAX, а не EDI?? ведь результат работы функции будет находиться в EDI???
5. функция cats:
mov byte ptr [EDI], 0//по адресу, находящемусчя в EDI (адрес последнего символа+1, записываем символ конца строки
//а где мы записывали адрес конца строки в EDI?????
подскажите, пожалуйста, кто что может. Заранее огромное спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2011, 22:52
Ответы с готовыми решениями:

Работники IT-сферы! Ответьте, пожалуйста, на несколько вопросов
Добрый вечер, господа! Мне нужно взять интервью у тех, кто работает в сфере информационных технологий. Пожалуйста, ответьте на несколько...

Ответьте на несколько теоретических вопросов
Основы программирования на языке СИ 1) Для решения каких задач может применяться смешанное программирование? 2) Назовите основные типы...

Ответьте пожалуста на несколько вопросов
По мере наполнения сайта контентом и наращивания внешних ссылок возникло пару вопросов, пожалуйста помогите. 1) На форуме есть услуга,...

3
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
19.05.2011, 11:09
1.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
ведь аргументы - 3шт по одному байту?
push eax - как раз 4 байта) А указатель при 32х разрядной адресации всегда 4 байта, не важно даже указатель на какой тип, ведь в него записывается адрес.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
И еще вопрос. зачем после call вызывать ADD ESP, 12??
по конвенции вызова си, стек чистит вызывающая процедура. Почитай про соглашения о вызовах stdcall, _cdecl, pascal, etc.
2.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
CLD//???????????????????????????????????????? ??????????что это делает???
Сбрасывает флаг направления. Этот флаг определяет поведение команд обработки строк - когда он установлен, строки обрабатываются в сторону уменьшения адресов, а когда сброшен - увеличения
3.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
xor AL, AL//зачем эта команда нужна???
так ведь комментарий в следующей строке и объясняет:
Цитата Сообщение от Dimarik__ Посмотреть сообщение
//сканировать пока не встретится 0
4.
Цитата Сообщение от Dimarik__ Посмотреть сообщение
почему EAX, а не EDI??
функции возврящают результат в регистре eax для целых, или на вершине стека сопроцессора для вещечтвенных результатов
5. после команды rep movsb значение в регистре edi увеличится на ecx и будет указывать на конец строки
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
19.05.2011, 11:17  [ТС]
ну.. по поводу 3го вопроса. Я имел в виду, какая функция использует регистр AL? для какой функции там важно чтобы был 0??
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
19.05.2011, 11:22
Dimarik__, посмотри в справочнике о команде REPNE SCASB это ответ на третий вопрос
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2011, 11:22
Помогаю со студенческими работами здесь

Несколько вопросов про VB(код)
Всем доброго времени суток!Есть несколько вопросов и проблем! 1)В программе у меня есть файл 1.reg(См скрин).,с параметрами реестра.Как...

Разбираю код одной темы, что означает следующий код и зачем он нужен?
Доброго времени суток всем. Скачал тут как-то на днях вот такую тему для wordpress и смотрю, разбираю, что там внутри и как это работает. ...

Ответьте пожалуйста
Здравствуйте! Ответьте пожалуйста на мои вопросы 1 - у меня есть сайт в индексе yandex! Если я обменяюсь ссылками у меня поднимится...

Ответьте пожалуйста
Есть 2 программы, одна клиент (ClientSocket), а другая сервер (ServerSocket). Если на одном компьютере подключатся не к...

Пожалуйста ответьте на задачи
Задача 1 В среде Delphi создать форму с включением графического рисунка. Задача 2 В среде Delphi создать форму с применением панели...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru