Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
123Unknown
1 / 1 / 0
Регистрация: 26.11.2012
Сообщений: 31
#1

Начало работы со встроенным ассемблером - C++

04.05.2013, 16:28. Просмотров 2253. Ответов 10
Метки нет (Все метки)

Помогите, кто знает как с этим работать
Проходим в универе встроенные в с++ ассемблер, накидал простейшую программку(ввод строки символов с клавиатуры и её же вывод на экран)
Собственно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 #include <iostream>
 using namespace std;
 int main()
 {
 _asm
 {
.data
 string db 3, ?, 4 dup(?)
 .code
 Programm:
 mov ax, @data
 mov ds, ax
 lea dx, string
 mov ah, 10
 int 21h
 lea dx, string+2
 mov string+5, '$'
 mov ah, 4ch
 int 21h
 end Programm
 }
 system("pause");
 }
Компилится не хочет, пишет:
source.cpp(7): error C2400: inline assembler syntax error in 'opcode'; found 'data'
source.cpp(8): error C2400: inline assembler syntax error in 'opcode'; found 'db'
source.cpp(9): error C2400: inline assembler syntax error in 'opcode'; found 'code'
source.cpp(11): error C2018: unknown character '0x40'
source.cpp(11): error C2443: operand size conflict
source.cpp(20): error C2400: inline assembler syntax error in 'opcode'; found 'Programm'

Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 16:28     Начало работы со встроенным ассемблером
Посмотрите здесь:
C++ Начало работы с ПО С++
C++ Начало работы в С++
Начало работы с файлами bmp C++
Реализовать функционал работы с одномерным динамическим массивом (добавление одного элемента в начало) C++
C++ Нужна помощь с ассемблером.
C++ Как определить, является ли переменная встроенным массивом?
Цикл с встроенным Switch (вычислить значение произведения) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 715
04.05.2013, 18:05     Начало работы со встроенным ассемблером #2
вы знаете, я могу заблуждаться (имел опыт только в паскале с inline assembler да и больше AT&T синтаксис, а не Intel)
но мне почему-то кажется, что нельзя определять в inline assembler блоки
.data
.code
и уже тем более данные типа string db 3, ?, 4 dup(?)

определите данные в С++ коде, а не макросе __asm а тут сразу код пишите, это по поводу первых трёх ошибок

дальше вы пишите в конце
Assembler
1
2
mov ah, 4ch
 int 21h
это гарантированно фигню пишите... это завершение программы, которое явно сюда писать не надо, С++ сам завершит программу, как ему надо

Assembler
1
end Programm
это я понимаю тоже не от большого ума, это тут не уместно вообще

Assembler
1
2
mov ax, @data
 mov ds, ax
и это тоже, разберитесь что делают эти две строчки на досуге и подумайте нафига это в inline assmbler?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
04.05.2013, 18:09     Начало работы со встроенным ассемблером #3
а откуда взят этот код? Это точно не inline ассемблер.
abit прав. Все данные объявляь как обычные переменные Си. Не случайно тут есть слово inline. Ассемблерные вставки это именно фрагменты кода, которые компилятор вставит в основную программу. Это не самостоятельная программа на асме.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
04.05.2013, 18:12     Начало работы со встроенным ассемблером #4
Вроде все уже написали выше, еще вот это
Цитата Сообщение от 123Unknown Посмотреть сообщение
mov ah, 10
int 21h
будет работать только под DOS'ом.
123Unknown
1 / 1 / 0
Регистрация: 26.11.2012
Сообщений: 31
04.05.2013, 18:58  [ТС]     Начало работы со встроенным ассемблером #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вроде все уже написали выше, еще вот это

будет работать только под DOS'ом.
Хм. Спасибо, т.е. ввод с клавиатуры никак нельзя реализовать через встроенный ассемблер ?
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
04.05.2013, 19:01     Начало работы со встроенным ассемблером #6
Цитата Сообщение от 123Unknown Посмотреть сообщение
ввод с клавиатуры никак нельзя реализовать через встроенный ассемблер ?
почему, можно. Например через тот же scanf().
123Unknown
1 / 1 / 0
Регистрация: 26.11.2012
Сообщений: 31
04.05.2013, 19:08  [ТС]     Начало работы со встроенным ассемблером #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
почему, можно. Например через тот же scanf().
Я имел в виду возможность организовать ввод/вывод данных внутри ассемблерной вставки _asm{}, т.е. через команды именно ассемблера, или
это тоже невозможно ?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
04.05.2013, 19:16     Начало работы со встроенным ассемблером #8
Цитата Сообщение от 123Unknown Посмотреть сообщение
Я имел в виду возможность организовать ввод/вывод данных внутри ассемблерной вставки _asm{}, т.е. через команды именно ассемблера, или
это тоже невозможно ?
попробуй посмотреть в какой ассемблерный код превращается вызов scanf в окошке disassembly и напиши аналогичный в ассемблерной вставке
123Unknown
1 / 1 / 0
Регистрация: 26.11.2012
Сообщений: 31
04.05.2013, 19:27  [ТС]     Начало работы со встроенным ассемблером #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
попробуй посмотреть в какой ассемблерный код превращается вызов scanf в окошке disassembly и напиши аналогичный в ассемблерной вставке
Т.е. уже придуманного механизма для этого нету ?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
04.05.2013, 19:31     Начало работы со встроенным ассемблером #10
что там думать? Дело двух минут.
1я минута, смотрим в окне disassembly какой ассемблер соответствует вызову scanf и пишем аналогичную вставку.
2я минута исправляем ошибки.
в итоге
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(int argc, char * argv[])
{
  int m;
  char* form="%d";
  _asm{
    lea         eax,[m] 
    push        eax  
    push        form
    call        dword ptr [scanf] 
    add         esp,8 
  }
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 21:15     Начало работы со встроенным ассемблером
Еще ссылки по теме:
Данный массив A (n). Все положительные его элементы поместить в начало массива B (n), а все отрицательные - в начало массива C (n). Подсчитать количес C++
C++ Все положительные элементы поместить в начало массива В(n), а отрицательные элементы — в начало массива С(n)
Переделать программу работы с массивом для работы с вектором C++
C++ Начало Си++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
04.05.2013, 21:15     Начало работы со встроенным ассемблером #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Assembler
1
call dword ptr [scanf]
можно просто писать
Assembler
1
call scanf
компилятор поймет.

Добавлено через 3 минуты
Цитата Сообщение от 123Unknown Посмотреть сообщение
т.е. через команды именно ассемблера
так это в принципе не возможно. Тот же int 21h - это средство DOS'а, можно еще по другому (вроде int 10h, не помню), но это уже средство BIOS'а. Т.е. в любом случае придется использовать что-то стороннее.
В данном случае (имею ввиду scanf()) - это средство языка С, которое внутри себя использует средства Windows.
Yandex
Объявления
04.05.2013, 21:15     Начало работы со встроенным ассемблером
Ответ Создать тему
Опции темы

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