Tôi đang cố gắng tạo ra một thủ tục ngủ/trì hoãn trong 16bit MASM Assembly x86 sẽ in một ký tự trên màn hình mỗi 500ms. Từ nghiên cứu tôi đã làm, có vẻ như có ba phương pháp để đạt được điều này - Tôi muốn sử dụng một phương pháp sử dụng các đồng hồ CPU.Làm cách nào để tạo chức năng ngủ trong 16bit MASM Assembly x86?
Xin lưu ý rằng tôi đang chạy Windows XP thông qua VMWare Fusion trên Mac OS X Snow Leopard - Tôi không chắc liệu điều đó có ảnh hưởng gì không.
Có thể ai đó vui lòng chỉ cho tôi đúng hướng hoặc cung cấp một đoạn mã hoạt động mà tôi có thể tinh chỉnh không? Cảm ơn bạn!
Mã tôi tìm thấy được in là 'A' trên màn hình mỗi giây, nhưng không hoạt động (tôi muốn sử dụng phần nghìn giây).
TOP:
MOV AH,2C
INT 21
MOV BH,DH ; DH has current second
GETSEC: ; Loops until the current second is not equal to the last, in BH
MOV AH,2C
INT 21
CMP BH,DH ; Here is the comparison to exit the loop and print 'A'
JNE PRINTA
JMP GETSEC
PRINTA:
MOV AH,02
MOV DL,41
INT 21
JMP TOP
EDIT: Làm theo lời khuyên của GJ, đây là quy trình làm việc. Chỉ cần gọi nó là
DELAY PROC
TIMER:
MOV AH, 00H
INT 1AH
CMP DX,WAIT_TIME
JB TIMER
ADD DX,3 ;1-18, where smaller is faster and 18 is close to 1 second
MOV WAIT_TIME,DX
RET
DELAY ENDP
bạn đang chạy mã của bạn trong Userland? Trên Windows? – nico
Có. Tôi đang chạy nó trên Windows thông qua một máy ảo, như đã nêu trong bài viết của tôi :) –
Hãy cẩn thận lúc nửa đêm bạn có thể có một vấn đề. Có lẽ là ý tưởng tốt hơn để đọc trực tiếp vị trí bộ nhớ đánh dấu tại 0x0040: 0x0070. Đọc thêm: http://www.merlyn.demon.co.uk/pas-time.htm#RDT –