Использование C с проблемой начинающего встроенного ассемблера - PullRequest
0 голосов
/ 01 сентября 2009

Я просто тестирую и пытаюсь узнать, как ассемблер работает с C. Итак, я просмотрел несколько уроков и нашел:

__asm
{
    mov     ax,0B800h       //startaddress for the screen memory (in textmode)
    mov     es,ax           //add the startaddress to es

    xor     di,di           //reset di (start at the beginning of the screen)

    mov     al, 65          //65 = ascii for the 'A' character to al
    mov     ah, 16*4+1      //Attribute = blue text on a red background to ah.
    mov     cx,2000         //25*80 = 2000 characters on the screen
    rep     stosw           //write ax to the screen memory and count di up 2000 times

}

У меня проблема в том, что я не могу запустить его, я могу скомпилировать его в своем основном методе в Microsoft Visual Studio 2008, но когда я его запускаю, выдается эта ошибка:

Необработанное исключение в 0x00da3660 в Test.exe: 0xC0000005: Место чтения нарушения доступа 0xffffffff.

во второй строке: mov es, axe // lägg startadressen i es

Может быть, программа 16-разрядная и VS 2008 компилирует ее в 32-разрядную программу? Если да, можете ли вы заставить VS 2008 компилировать его по-другому?

Кто-нибудь знает хороший учебник по внутреннему ассемблеру?

Ответы [ 6 ]

4 голосов
/ 01 сентября 2009

Это 16-битный код DOS, предполагающий множество вещей, которые давно не соответствуют действительности. Вам лучше поискать другой учебник.

1 голос
/ 18 января 2011

Я переписываю ваш код как:

[BITS 16]
[ORG 7C00h]
main:

mov     ax,0B800h
mov     es,ax
xor     di,di
mov     al, 65
mov     ah, 16*4+1
mov     cx,2000
rep     stosw

times 510-($-$$) db 0
dw 0xAA55

Затем сохраните его как xxx.asm и скомпилируйте его с помощью «nasm xxx.asm», а затем запустите его внутри kvm: «kvm xxx» или вы также можете «dd» перенести на жесткий диск и загрузиться прямо с код и увидеть его работает. Все сделано в среде Ubuntu. Здесь много других похожих примеров:

Руководство Гэвина по сборке 80x86. Часть 7.

http://stuff.pypt.lt/ggt80x86a/asm8.htm

1 голос
/ 16 июля 2010

Здравствуйте, я нашел очень хороший учебник !, он объясняет с помощью простых диаграмм каждую деталь.

Это именно то, что вы ищете:)!

http://rodrigosavage.blogspot.com/2010/07/hello-world-with-inline-asm.html

0 голосов
/ 01 сентября 2009

Это код DOS. Для изучения ассемблера Win32 «классика» является учебником Ичелиона Взгляните здесь

0 голосов
/ 01 сентября 2009

Windows не разрешает прямой доступ к видеопамяти. Если вы хотите работать в консоли, вы должны использовать API, связанный с консолью .

0 голосов
/ 01 сентября 2009

rep stosw повторяет сохранение слова от ax до es: di, и ваш es: di имеет значение B800: 0, что является произвольным в защищенном режиме и может не отображаться в вашей программе, что приводит к ошибке сегментации. Это похоже на древний код. Если у вас есть DOS, он может просто работать

...