Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873

Си -> asm

02.10.2014, 15:43. Показов 3904. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется такая функция на си
C
1
2
3
4
5
6
7
8
9
void swap(unsigned char* a, unsigned char* b) {
    unsigned char tmp;
    int i;
    for (i = 0;i<3;i++) {
        tmp = *a;
        *a++ = *b;
        *b++ = tmp;
    }
}
и есть заготовка для функции на асм (надо сделать ассемблерные вставки)
C
1
2
3
4
5
void swap_asm(unsigned char* a, unsigned char* b) {
    _asm {
        
    }
}
как сделать эти функции эквивалентными..?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2014, 15:43
Ответы с готовыми решениями:

Создание проекта с участием c++ и asm модулей. Ошибка asm модуля
Доброго времени суток! Подскажите, пожалуйста, как исправить данную ошибку (А2008)?

Delphi и ASM - не работает вызов функции Invoke через asm
В Delphi не работает вызов функции Invoke через asm. часть кода: asm invoke CloseHandle,ebx; invoke ExitProcess,0; ...

ASM atmega написать программу на ASM
Нужна помощь в написании программы с объяснениями.. Проверить свою программу Вашу работу. Подпрограмма для ATmega1284 на Асм,...

52
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
02.10.2014, 15:51
в дизассемблере в режиме отладки посмотреть для начала.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
02.10.2014, 15:59
Дык, как-то так:
C
1
2
3
4
5
6
7
8
void swap(unsigned char* a, unsigned char* b) {
    _asm{   mov esi, a
            mov edi, b
            mov eax, [esi]
            xchg    eax, [edi]
            mov [esi], eax
            }
}
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
02.10.2014, 16:09  [ТС]
я использую среду qt creator, но пишу на си
а надо сделать вставку на асм на интел-синтаксисе
Charles Kludge, есть разница между вашим кодом и интел-синтаксисом?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
02.10.2014, 16:13
spydark91, кто мешает проверить? Просто уже давно пишу на Ваткоме, не хочу его на что-то менять.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
02.10.2014, 16:18  [ТС]
компилятор не понимает..
в этой среде gcc, а чтобы он понимал интел-синтаксис надо использовать какие то особые вставки асемблера..мб в этом все дело
Миниатюры
Си -> asm  
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
03.10.2014, 04:04
Цитата Сообщение от spydark91 Посмотреть сообщение
компилятор не понимает..
spydark91,
а справочник/учебник читать кто будет?
переменные a и b объявлены как unsigned char то есть как 8-разрядные, ты пытаешься затолкать их в 32-разрядные переменные в результате "несоответствие типов", команда xchg должна иметь ДВА операнда, у тебя операндов нет...
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.10.2014, 09:35
Mikl___, там gcc с синтаксисом AT&T. Вобщем, уныло.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
03.10.2014, 09:53  [ТС]
Mikl___, делал как посоветовал Charles Kludge

Добавлено через 17 минут
Charles Kludge, ваш код ведь выполняет только
C
1
2
3
tmp = *a;
        *a++ = *b;
        *b++ = tmp;
без цикла и без инкримента указателей?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.10.2014, 10:10
Цитата Сообщение от spydark91 Посмотреть сообщение
без цикла и без инкримента указателей?
А зачем? В 4 байта(3 символа и "\0") всё укладывается без цикла.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void swap(unsigned char* a, unsigned char* b) {
    _asm{   mov esi, a
            mov edi, b
            mov eax, [esi]
            xchg    eax, [edi]
            mov [esi], eax
            }
}
void main(void){
char *a = "123", *b = "456";
swap(a,b);
printf("%s %s", a, b);
}
А знать синтаксис AT&T пока не хочется.
1
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
03.10.2014, 10:26
Цитата Сообщение от Charles Kludge Посмотреть сообщение
там gcc с синтаксисом AT&T.
ну кьют можно и под студию заточить, только это еще более унылое какашко.
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
03.10.2014, 16:39
Цитата Сообщение от spydark91 Посмотреть сообщение
я использую среду qt creator, но пишу на си
а надо сделать вставку на асм на интел-синтаксисе
Charles Kludge, есть разница между вашим кодом и интел-синтаксисом?
Как вариант писать не вставки а модули на асме и компилировать любым подключенным компилятором по желанию.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
14.10.2014, 11:19  [ТС]
C
1
2
3
4
5
6
7
8
9
void swap(unsigned char* a, unsigned char* b) {
    unsigned char tmp;
    int i;
    for (i = 0;i<3;i++) {
        tmp = *a;
        *a++ = *b;
        *b++ = tmp;
    }
}
C
1
2
3
4
5
6
7
8
9
10
unsigned char *a = img + (i * imgW4) + 3 * j;
            unsigned char* b = img + ((bmpHeader.height - i - 1) * imgW4) + 3 * j;
            _asm {
                mov esi, a;
                mov edi, b;
 
                mov eax, [esi];
                xchg eax, [edi];
                mov [esi], eax;
            }
первый код нормально переворачивает картинку(естественно, вызов функции swap и использование второго кода происходит в цикле). а второй код переворачивает кривовато(смотри приложение)
почему?
Миниатюры
Си -> asm  
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
14.10.2014, 14:07
Цитата Сообщение от spydark91 Посмотреть сообщение
а второй код переворачивает кривовато(смотри приложение)
почему?
код на асме делает обмен и отрабатывает правильно.
Если в целом код написан криво,это вопросы к кодеру.
Отладку делай и ищи баги.

Добавлено через 1 час 1 минуту
пробуй смещаться на 4,если не ошибаюсь.
ARGB - 4 байта.
Лучше сразу меняй по 4 байта.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
14.10.2014, 18:27  [ТС]
Как раз код на си норм работает
А код на асм криво
Дак там же регистры и так четырехбайтные
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
14.10.2014, 20:32
spydark91,

mov [esi], eax ;пишешь по 4 байта ,а смещаешься по 3.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
14.10.2014, 21:32  [ТС]
а как по 4 смещаться?

Добавлено через 15 минут
Цитата Сообщение от Thread Посмотреть сообщение
,а смещаешься по 3.
где вообще там происходит смещение?

Добавлено через 15 секунд
это же просто пересыл
0
programmer
 Аватар для Thread
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
14.10.2014, 21:38
spydark91,

unsigned char *a = img + (i * imgW4) + 3 * j;
unsigned char* b = img + ((bmpHeader.height - i - 1) * imgW4) +3 * j;

это что?твое?

покажи мне весь твой код .и опиши переменные и структуры с которыми приходиться работать.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
14.10.2014, 22:00  [ТС]
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
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <time.h>
int readBMP(char* path);
int saveBMP(char* path);
void swap(unsigned char* a, unsigned char* b);
void rotate();
void rotate_asm();
 
#pragma pack(push, 2)
struct BmpHeader {
    unsigned char b1, b2; // Символы BM (2 байта)
    unsigned long size; // Размер файла (4 байта)
    unsigned long reserved; // (4 байта)
    unsigned long massPos; // Местанахождение данных растрового массива, обычно 54 (4 байта)
 
    unsigned long headerLength; // Длинна этого заголовка (4 байта)
    unsigned long width; // Ширина изображения (4 байта)
    unsigned long height; // Высота изображения (4 байта)
    unsigned short colorPlaneNumber; // Число цветовых плоскостей (2 байта)
    unsigned short bitPixel; // Бит/пиксель (2 байта)
    unsigned long compressMethod; // Метод сжатия (4 байта)
    unsigned long massLength; // Количество байта в поле данных (4 байта)
    unsigned long wpixelsPerMeter; // Количество точек по горизонтали на дюйм (4 байта)
    unsigned long hpixelsPerMeter; // Количество точек по вертикали на дюйм (4 байта)
    unsigned long colorNumber; // Число цветов изображения (4 байта)
    unsigned long generalColorNumber; // Число существеных цветов (4 байта)
 
} bmpHeader;
#pragma pack(pop)
unsigned char* img;
int imgW4;
int main(void) {
    int i, t;
    //rotate_asm();
    if (readBMP("D:\\1.bmp") == 0) {
        printf("bad path");
        return 0;
    }
    t = clock();
    for (i = 0; i<10;i++) rotate();
    t = (clock()-t)/10;
    printf("time = %d milliseconds",t);
   // rotate();
    rotate_asm();
 
    if (saveBMP("D:\\_1.bmp") == 0) {
        printf("bad path");
        return 0;
    }
    getchar();
    return 0;
}
 
 
int readBMP(char* path) {
    FILE* file;
    file = fopen(path,"rb");
    if(file == NULL) return 0;
    fread(&bmpHeader, sizeof(bmpHeader), 1, file);
    if (bmpHeader.b1 != 'B' || bmpHeader.b2 != 'M' || bmpHeader.bitPixel != 24) {
        printf("corrupted file");
        return 0;
    }
 
    imgW4 = (3 * bmpHeader.width + 3) / 4 * 4;
    img = (unsigned char*)calloc(imgW4 * bmpHeader.height, sizeof(char));
    fread(img, 1, imgW4 * bmpHeader.height, file);
    fclose(file);
 
    return 1;
}
 
void swap(unsigned char* a, unsigned char* b) {
    unsigned char tmp;
    int i;
    for (i = 0;i<3;i++) {
        tmp = *a;
        *a++ = *b;
        *b++ = tmp;
    }
}
void rotate() {
    unsigned int i, j;
    for (i = 0; i < bmpHeader.height / 2; ++i) {
        for (j = 0; j < bmpHeader.width; ++j) {
            swap(img + (i * imgW4) + 3 * j,
                 img + ((bmpHeader.height - i - 1) * imgW4) + 3 * j);
        }
    }
}
void rotate_asm() {
    unsigned int i, j;
    for (i = 0; i < bmpHeader.height / 2; ++i) {
        for (j = 0; j < bmpHeader.width; ++j) {
            unsigned char *a = img + (i * imgW4) + 3 * j;
            unsigned char* b = img + ((bmpHeader.height - i - 1) * imgW4) + 3 * j;
 
            _asm {
                //xor esi, esi;
                //xor edi, edi;
                mov esi, a;
                mov edi, b;
 
            //  shl [edi], 8;
        //      shl [esi], 8;
 
                mov eax, [esi];
                xchg eax, [edi];
                mov [esi], eax;
                
 
            }
 
 
        }
    }
 
}
Добавлено через 42 секунды
Цитата Сообщение от Thread Посмотреть сообщение
unsigned char *a = img + (i * imgW4) + 3 * j;
unsigned char* b = img + ((bmpHeader.height - i - 1) * imgW4) +3 * j;
с этими строками все хорошо, тк код на си выполняет все верно. а эти строки идентичны
0
15.10.2014, 00:09

Не по теме:

А не рановато ли ты за ассемблерную оптимизацию взялся? ;D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2014, 00:09
Помогаю со студенческими работами здесь

pascal+asm, не подключается модуль asm
Не получается подключить модуль ассмблера ( находится в каталоге с .pas)). Для примера взял элементарный код на паскале: 1 {$L...

При сборке выдает ошибку "MASM: fatal error A1000: : 1.asm.asm"
&quot;MASM : fatal error A1000: : 1.asm.asm :\1&gt;link16 /TINY 1.asm.obj, 1.asm.com&quot; Вопользовался кодом из темы Собирал через...

IDE для для работы с STM8 (на ASM и C) и STM32 (на C, ASM)
Планирую перезод на МК от STM. Сегодня стал обладателем платки STM32F4-Dyscovery и пакетика восьмибитных STM. Под восьмибитники планирую...

C++ И ASM
Всем привет. Мне нужно создать функцию на С++, но особенную. Мне нужно, чтобы она была пустая, при void Func(){}, компилятор уже...

Из COM в ASM
Доброго времени суток. Есть в книге Абеля COM-код. Помогите его перевести, пожалуйста, для компиляции в EXE. Да и вообще, полезно было бы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru