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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
#1

Коды Assembler в C/C++ - C++

05.12.2013, 01:43. Просмотров 1779. Ответов 9
Метки нет (Все метки)

Здравствуйте!
Я столкнулся с проблемой при использовании кодов Assembler в C/C++. Я читал, что в C/C++ существует функция _asm, в которой пишутся команды Assembler:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
...
_asm
{
_msg db 'Hello$'
mov ah, 09h
mov dx, offset _msg
int 21h
}
...

Но, данный код у меня не заработал (где то пишут, что надо "_asm mov ah, 09h"(т.е. перед каждой командой Assembler писать _asm, где то _asm {/*начало*/ /*конец*/}... Но ни тот, ни другой вариант у меня не заработал...)...
В варианте с началом-концом мне выдавалась следующая ошибка:
Кликните здесь для просмотра всего текста

error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "db"
error C2015: слишком много знаков в константе
error C2443: конфликт размеров операндов

Подскажите пожалуйста, в чём может быть проблема?
P.S. Я использую Microsoft Visual Studio 2012... В Pascal (в ABC.NET, во всяком случае, как я читал), нету поддержки команд Assembler (она была только по Turbo Pascal)... Может быть, здесь такая же проблема? Или синтаксис команд Assembler не правильный(но, emu8086 так не считает)...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2013, 01:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Коды Assembler в C/C++ (C++):

Коды C++ - C++
Можете написать код Марио?:help: Добавлено через 53 секунды :beer:

Коды программ ... - C++
Вопрос 1 ый , на windows 7 не ставится с++3,01 , сказали, что в 6 билдере можно где то включить , чтобы было как в c++ 3.01 И вот...

Коды символов - C++
Как вам всем известно, для кодировки символов используется таблица ASCII, вот написал: #include"stdafx.h" #include"iostream" using...

getch и коды - C++
здравствуйте господа програмисты!как сделать что бы при нажатии клавиши "w" выскакивало надпись привет народ,но только при нажатии именно...

короткие коды с ******** - C++
всем привет я решил создать общую тему по сокращению кодов (если у кого есть по короче по желанию напишите на форум нужно писать так №...

На троичные коды - C++
Есть индикатор, отображающий запись чисел в троичной системе счисления с помощью двухцветных светодиодов. Каждый светодиод может гореть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
05.12.2013, 02:01 #2
Времена доса давно прошли. Если пишешь под виндой - Прерывания не нужны!
0
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
05.12.2013, 02:09  [ТС] #3
Kuzia domovenok, можете дать пример Assembler в C/C++?
Просто, как я не пишу-всё равно, на _asm mov ah, 09h - всё нормально, но как только я посылаю в dx параметр для вывода на экран, или объявляю переменную для хранения строки для вывода-всё...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
05.12.2013, 02:17 #4
Второе. А кто тебе вообще сказал, что ты можешь объявлять глобальные переменные в ассемблерной вставке?
Нужна глобальная переменная? Объяви её как обычную глобальную переменную в си.

И ещё раз:
не используй прерывания!

Добавлено через 6 минут
Jack Wade, ладно. Смотри. Что ты хочешь написать?
Hello world на асме? Под какую ос? Под винду?
Нужна именно вставка в код си или код, скажем для MASM?
0
Jack Wade
63 / 36 / 6
Регистрация: 24.02.2013
Сообщений: 250
05.12.2013, 02:24  [ТС] #5
Кликните здесь для просмотра всего текста

Всё таки, непревычен Assembler, после C/C++...

В общем-я не смог вывести сообщение на экран консоли, но смог сложить 2 числа(большое достижение однако...)...
Кликните здесь для просмотра всего текста

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int res=0;
_asm
{
mov eax, 1;
mov ebx, 2;
add eax, ebx;
mov res, eax;
}
printf("%d\n", res);
_gettch();
return 0;
}

Подскажите пожалуйста, как тогда мне использовать функции 09h, 02h, и другие функции? Допустим, вот я хочу вывести текст на экран консоли при помощи команд Assebler, значит, как мне это реализовать в MSVS2012?

Добавлено через 1 минуту
Kuzia domovenok, пишу под Windows(ОС установлена 8-ка).
Мне бы хотелось, хотя бы для начала, узнать, как использовать функцию 09h для вывода текста на экран.

Добавлено через 1 минуту
В emu8086(которому нас и обучали(да и обучают)), вывод на экран происходил след. образом:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
.model tiny
.stack 100h
.data
_message_text db 0ah, 0dh, 'This_Is_Text$'
.code
main
mov ah, 09h
mov dx, offset _message_text
int 21h
end main
end
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
05.12.2013, 02:27 #6
Цитата Сообщение от Jack Wade Посмотреть сообщение
Кликните здесь для просмотра всего текста

Всё таки, непревычен Assembler, после C/C++...

В общем-я не смог вывести сообщение на экран консоли, но смог сложить 2 числа(большое достижение однако...)...
Кликните здесь для просмотра всего текста

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int res=0;
_asm
{
mov eax, 1;
mov ebx, 2;
add eax, ebx;
mov res, eax;
}
printf("%d\n", res);
_gettch();
return 0;
}

Подскажите пожалуйста, как тогда мне использовать функции 09h, 02h, и другие функции? Допустим, вот я хочу вывести текст на экран консоли при помощи команд Assebler, значит, как мне это реализовать в MSVS2012?

Добавлено через 1 минуту
Kuzia domovenok, пишу под Windows(ОС установлена 8-ка).
Мне бы хотелось, хотя бы для начала, узнать, как использовать функцию 09h для вывода текста на экран.

Добавлено через 1 минуту
В emu8086(которому нас и обучали(да и обучают)), вывод на экран происходил след. образом:
Кликните здесь для просмотра всего текста

Assembler
1
2
3
4
5
6
7
8
9
10
11
.model tiny
.stack 100h
.data
_message_text db 0ah, 0dh, 'This_Is_Text$'
.code
main
mov ah, 09h
mov dx, offset _message_text
int 21h
end main
end
никак, для современных виндоувс

Добавлено через 1 минуту
Нужно искать старый компилятор и компилить 16-разрядный код
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
05.12.2013, 02:48 #7
Jack Wade, Jack Wade, Jack Wade, изучаешь ассемблер для DOS так и пиши для доса, а не под виндой! Поставь dosbox, пиши под ним. Найди ассемблер для доса. (под вин ХР можно было обойтись без эмулятора)
А если вынужден делать ассемблерные вставки в Си, то и среду с компилятором си ищи для доса! Например пиши в borland C++ 3.1 for DOS.
Однако, под виндой, чтобы вывести хелоуворлд, ты обязан использовать WinApi, а не прерывания!
0
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
05.12.2013, 02:52 #8
зачем собственно нужно писать на ассемблере такие вещи как вывод сообщения?
как уже выше писали, поюзать прерывания не получится - но оно и нафик не нужно, в прикладном программировании.
(конкретно вывод текста будет выглядеть примерно так- пуш пуш пуш call вывод_на экран)
ассемблер нужно использовать там где он реально нужен.
(например враппер, которому передается управление после нестандартного инжекта/сплайсинга функции)
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
05.12.2013, 03:09 #9
МаксимТ, не, ну если очень припёрло делать вывод сообщения асм вставкой, то можно написать, например
push...
push...
push...
call WriteConsoleA
или же
call printf
0
aperechnev
0 / 0 / 0
Регистрация: 05.12.2013
Сообщений: 7
05.12.2013, 03:28 #10
Писал давече статью на тему использования Assembler в C++: http://perechnev.com/2013/11/09/осно...й-оптимизации/

Для разного рода познавательных экспериментов я бы советовал использовать g++. Все таки изучать так глубого именно технологии Microsoft - неперспективно. Не ориентируйся на Visual Studio.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 03:28
Привет! Вот еще темы с ответами:

не разборчивые коды - C++
помогите пожалуйста ответить на вопросы? заранее спасибо. немного не понятны вопросы, особенно первые 1. (10%)Is next statement...

Корректирующие коды - C++
а). преобразовать заданное информационное слово 10101101011 из 11 двоичных цифр в двоичное слово кода Хемминга (15,11); б). дано...

Коды исключений - C++
Какие ещё, кроме std::bad_alloc, есть коды исключений? Содержит ли исключение информацию о месте своего возникновения? А о конкретной...

Коды Хэмминга С++ - C++
Коды Хэмминга С++


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.12.2013, 03:28
Ответ Создать тему
Опции темы

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