2010-03-01 32 views
6

Dưới đây là các mã:Tại sao chương trình masm32 của tôi bị lỗi bất cứ khi nào tôi thử sử dụng ngắt?

.386 ;target for maximum compatibility 
.model small,stdcall ;model 
.code 
    main: 
     int 20h 
    END main 

Kết quả: http://img705.imageshack.us/img705/3738/resultom.png

"test.exe đã ngừng làm việc" - luôn luôn đúng khi nó đạt đến ngắt.

This is the interrupt I'm trying to use. Nó chỉ cần thoát khỏi chương trình. Những người khác tôi đã cố gắng bao gồm đầu vào/đầu ra ký tự, vv .. Không có gì hoạt động.

Tôi đang sử dụng Windows 7, sử dụng masm32 với IDE WinAsm.

Có rất nhiều điều thú vị, có vẻ như tôi có thể làm với ngắt ... tuy nhiên, nó bị treo bất cứ khi nào tôi cố gắng sử dụng ngắt - luôn giống như vậy.

Điều này có vẻ liên quan và có thể hữu ích: DOS Interrupt in masm x86 assembly crashing

... nhưng tôi đã không thực sự đã có thể tìm bất cứ thứ gì ra khỏi nó.

Mọi đề xuất?

Trả lời

5

Đúng. Ngắt của bản chất này là đặc biệt cho MS-DOS, và như vậy làm việc trong Windows ME và trước đó nhưng sẽ không làm việc trên kiến ​​trúc NT ngoại trừ theo giả lập DOS (command.com). Tôi không có ý tưởng nếu điều này vẫn còn tàu với Windows 7 - Tôi biết phiên bản x64 của Windows không có nó theo mặc định.

Nếu bạn đang viết Native NT Apps (bạn không chắc sẽ làm điều này nếu bạn không biết cái nào là, nhưng nếu bạn muốn tìm hiểu xem Blog của Mark Russinovich tại MSDN) danh sách các ngắt NT và chức năng tương ứng của họ: http://www.ctyme.com/intr/rb-4249.htm

khác hơn thế, bạn muốn gọi một hàm trong API Win32: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

Edit: và trong đó mẫu mã, bạn đã không quy định bất kỳ tùy chọn cho ngắt, thực hiện thông qua thanh ghi. Oh và bạn có thể nhận được nó làm việc cung cấp cho bạn lắp ráp cho DOS và không cho Windows. Nếu bạn sử dụng một Trình liên kết, bạn có thể sẽ tạo một tệp thực thi Windows PE. Tuy nhiên, nếu bạn đang sử dụng Windows 64 bit, như tôi đã nói, đừng thử.

Một điều bạn có thể làm là cài đặt hệ thống máy ảo như VirtualBox hoặc VMware và sau đó cài đặt FreeDOS. Nó không nên mất nhiều RAM ở tất cả và sẽ cho phép bạn thử nghiệm với lắp ráp/dos một cách tự do.

+0

Xin cảm ơn Ninefingers, tôi đoán là có ý nghĩa. Tôi chắc chắn sẽ nhìn vào một máy ảo, đó có lẽ là một ý tưởng hay! Ngoài ra, sự gián đoạn tôi đang sử dụng không có bất kỳ lựa chọn nào (tôi không nghĩ rằng dù sao), do đó, đó sẽ không phải là một vấn đề. – Cam

2

Ngoài @ninefingers câu trả lời xuất sắc - tôi có thể thêm int 20H sẽ chỉ hoạt động cho các chương trình 16 bit hay không. Và không bao giờ có thể được sử dụng bởi một .exe

Xem here.

2

Bạn phải cẩn thận khi lập trình ngắt. Nếu bạn đang ở bất cứ điều gì khác hơn là RealMode (16-bit), bạn thường không thể đạt được các ngắt ở mức CPU. Bảng mô tả ngắt phải có sẵn để lập chỉ mục bảng vectơ ngắt.

IVT nằm trong Vòng 0, nơi bạn có quyền truy cập trực tiếp, không bị cản trở vào phần cứng (CPU, Video, v.v.) Tất cả các ứng dụng sẽ chạy trong Vòng 3 (bao gồm hệ điều hành). IDT chứa các chỉ mục cho IVT. Điều này được thực hiện để bảo vệ phần cứng của bạn. Nếu bạn muốn truy cập các ngắt từ hệ điều hành, bạn sẽ cần phải đảm bảo rằng chúng có sẵn cho nguồn 32 bit của bạn.

0

Dưới 32 bit Windows có chế độ 86 ảo và với chế độ này, bạn có thể sử dụng các ngắt phần mềm RM cũ hơn từ DOS, vì Windows mô phỏng rất nhiều trong số đó. Ngoài ra sau khi chúng tôi đã cài đặt đúng trình điều khiển cho grafikcard của chúng tôi, thì có thể sử dụng một số phần mềm inthh intupts, ví dụ để lấy vesamodelist của vesabios trên thẻ của chúng tôi. Có nó là một mô phỏng, nhưng nó có được modenumbers thực tế và thông số môi trường của họ từ thẻ của chúng tôi, cũng nếu việc thay đổi tất cả những vesamodes là không thể dưới cửa sổ.

Ứng dụng DOS 16 bit cũng có thể sử dụng định dạng * .exe, nhưng đây là định dạng MZ, không phải định dạng PE.

Dirk

Các vấn đề liên quan