سؤال

لقد بدأت في تعلم بعض x86 الجمعية على win32 و لقد استعملت masm مع visual studio 2008 باستخدام مخصصة لبناء قاعدة يأتي مع ide على .asm الملفات.كنت أحاول استخدام دوس يقطع الطباعة إلى وحدة التحكم, ولكن بدلا من ذلك كنت تتلقى الرسالة التالية:"حدث استثناء غير معالج في 0x00401004 في ASMTest.exe:0xC0000005:انتهاك وصول القراءة الموقع 0xffffffff." على 8 خط.أحاول إخراج واحد ascii حرف 'A' (41h) هنا هو masm كود:

.386
.MODEL flat, stdcall

.CODE
start:
    mov dl, 41h
    mov ah, 2
    int 21h
    ret
end start

عند استخدام debug.exe واستخدام 'a' الأمر إلى إدخال جميع .رمز التعليمات و تشغيله ('g'), أنه يعمل بشكل جيد.

يمكن لأي شخص نورني على كيفية استخدام دوس يقطع بشكل صحيح ؟ وذلك بفضل!

تحرير:عندما برمجة win32 ، مانجو هو الحق الذي يجب عليك استخدام استدعاء windows api مثل WriteConsoleA بدلا من استخدام دوس المقاطعة. هذا كان مورد مفيدة.في حالة أي شخص يبحث عن رمز للقيام بذلك (كما كنت), هنا هو:

.386
.MODEL flat, stdcall

; Windows API prototypes
GetStdHandle proto :dword
WriteConsoleA proto :dword, :dword, :dword, :dword, :dword
ExitProcess proto :dword

STD_OUTPUT_HANDLE equ -11

.DATA
HelloWorldString db "hello, world", 10, 0

.CODE

strlen proc asciiData:dword
    ; EAX used as count, EBX as ascii char pointer, EDX (DL) as ascii char
    mov eax, -1
    mov ebx, asciiData
    mov edx, 0

    BeginLoop:
    inc eax       ; ++count (init is -1)
    mov dl, [ebx] ; *dl = *asciiptr
    inc ebx       ; ++asciiptr
    cmp dl, 0     ; if (*dl == '\0')
    jne BeginLoop ; Goto the beginning of loop

    ret
strlen endp

main proc
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov ecx, eax
    invoke strlen, addr HelloWorldString
    invoke WriteConsoleA, ecx, addr HelloWorldString, eax, 0, 0
    ret
main endp

end

(تعيين نقطة الدخول الرئيسية)

هل كانت مفيدة؟

المحلول

عند استخدام debug.exe لإدخال هذا الرمز، كنت تجميع (8086 الهندسة المعمارية، "الوضع الحقيقي") برنامج دوس 16 بت. دلالات تحدده صحيحة لمثل هذا البرنامج. ومع ذلك، عند تجميع البرنامج كنت قد حصلت هنا مع MASM، ومن ثم ربطه، كنت في محاولة لإنشاء 32-بت (العمارة I386، "الوضع المحمي") برنامج ويندوز. قد أكون مخطئا، لكنني لا أعتقد أنه يمكنك حتى من الناحية القانونية استدعاء الباحث 21H في الحالة الأخيرة.

نصائح أخرى

ومن الممكن أن يحدث بسبب بك تعليمات "متقاعد". أين أنت تعود إلى؟ في مكان غير معروف في الذاكرة، وأتصور.

وبدلا من ذلك، حاول استخدام كثافة 20H. وهذا الخروج "بأمان."

وكان يعمل في التصحيح (ربما) لأن هذا هو أكثر "تمكنت" بيئة.

إذا بدأنا 16 بت DOS-*.com التطبيق ، ثم DOS ملء شفرة تشغيل من "int 20" التعليمات داخل PSP عند الإزاحة 0 إضافية دوس الضغط على كلمة صفر على كومة من قبل دوس اسمحوا لنا تطبيق تنفيذ.حتى نتمكن من مكان بسيط "المتقاعد" تعليمات في نهاية رمز لدينا.ولكن علينا أن نتأكد من أن لدينا stackpointer هو ليس تالف و codesegment هو لم يتغير.

بالنسبة لربط 16 بت التطبيق باستخدام MASM 6+ نحن بحاجة إلى 16 بت رابط.

ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe

ديرك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top