Вопрос про асм код по с++
В асме вроде щас разобрался, пытаюсь зарядить код асма в С++.
Почитал мануалов, но нашел кучу противоречий+ реально не работают примеры.
есть асм код(тренировочный просто на вывод текста)
data segment para public "data"
upmessage db 10,13,'Tab version 0.1$ ',10,13
data ends
stk segment stack
db 256 dup ("?")
stk ends
code segment para public "code"
main proc
assume cs:code, ds:data,ss:stk
mov ax, data
mov ds, ax
mov ah, 9
mov dx, offset upmessage
int 21h
mov ax, 4c00h
int 21h
main endp
code ends
end main ;
********************************************
берем его вставляем в с++, в обычный вин 32 консольное приложение.
(по идее библиотек не надо как я понял)
void main()
{
_asm
{
data segment para public "data"
upmessage db 10,13,'Tab version 0.1$ ',10,13
data ends
stk segment stack
db 256 dup ("?")
stk ends
code segment para public "code"
main proc
assume cs:code, ds:data,ss:stk
mov ax, data
mov ds, ax
mov ah, 9
mov dx, offset upmessage
int 21h <-на одном форуме писали, что надо писать _int но тогда компилятор выдает ошибку.
mov ax, 4c00h
int 21h
main endp
code ends
end main ;
}
}
Так же я не понял надо ставить ли точку с запятой после каждой строчки. Компилятор выдает ошибку после каждой строчки кроме MOV и INT. Если вставить код на вывод идиночного символа eng "a", то отлачик кажит что в dl сидит русская буква "Я" , а при 21 прерывании выдается ошибка в процессе исполнения самого EXE файла.
char format[] = "%s \n";
char data[] = "FUCK OFF";
void main( void )
{
__asm
{
mov eax, offset data
push eax
mov eax, offset format
push eax
call printf
pop ebx
pop ebx
}
}
Как написать 9h в сишнике-так же как 9h или иначе?
Зачем тебе юзать ф-ции 21h если я показал альтернативный пример вывода строки если подумаешь то можешь заменить и 01h 02h тоже.... scanf также вызывается...
Пожалуйта напеши как написать int 21h на с++ как чисто асм код-или мануал кинь, а то я уже запарился искать по сети. Я студент и мне надо написать так как требует препод-препод меня мягко сказать не любит так, что надо делать тютелька в тютельку.
Послушай как никак ты пишешь на с или с++ компилятор не даст такого чистого ехе как при компановке на асме так что по любому как ни как ты юзаешь компилятор с его библиотеками... я посмотрю насчет 21h смотри этот пост на днях скину че нить .... (надеюсь те не надо вызывать прерывание 10h...)
Вообщем так проги компиленные на вс++ как ты знаешь работают в 3 кольце винды этот компилятор не даст тебе просто так обратится к 21 прерыванию... есть два выхода смена компилятора или посмотри альтернативный обработчик прерывания 21h
Цитата:
Originally posted by Ded pendos
Мне нужен код без использования сишных библиотек, а в си делается для упрощения использоания асмовского кода.
Пожалуйта напеши как написать int 21h на с++ как чисто асм код-или мануал кинь, а то я уже запарился искать по сети. Я студент и мне надо написать так как требует препод-препод меня мягко сказать не любит так, что надо делать тютелька в тютельку.
Мне нужен код без использования сишных библиотек, а в си делается для упрощения использоания асмовского кода.
Пожалуйта напеши как написать int 21h на с++ как чисто асм код-или мануал кинь, а то я уже запарился искать по сети. Я студент и мне надо написать так как требует препод-препод меня мягко сказать не любит так, что надо делать тютелька в тютельку.
Что-то меня ЭТА ТЮТЕЛЬКА не устраивает !!! :o
Ты уверен что препод задал тебе написать прогу в 32-х битном режиме, а не 16-и битном? В Microsoft все давно уже забыли про прерывания, начиная с Win 3.1. Даже в тухлой Windows 95 уже использовались API. Что касается прерывания int 21h - это бабушка DOS !!!