日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分析easyVM 未完成)

發布時間:2024/6/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析easyVM 未完成) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
E:\test\easyVM_Small_
指令解析,cpu虛擬
設備虛擬,比如display, DMA, floppy, harddisk, keyboard, PIC, printer, RTC, timer,serial
程序flow, 架構

低調發布easyVM 0.2版

簡介:
====================
easyVM是一個簡單的虛擬機。
0.1版本只支持8086指令集和一些簡單的I/O設備,只支持英文文本顯示方式。
0.2版本主要是在0.1版基礎上加了一小部分32位指令(push eax等),使得easyVM可以運行MS-DOS 6.22自帶的大部分程序。

文件說明:
====================
Bios\Bios.bin??????? Bios程序
Bios\BiosData.bin??? CMOS數據區
DOS.IMG??????????? MS-DOS 6.22的鏡像
easyVM.exe??????? easyVM主程序
easyVM.ini??????? easyVM的配置文件
Readme.txt??????? 本說明文本
TC.IMG??????????? 含有Trubo C 2.0的軟盤鏡像
Dos622c.img??????? 硬盤鏡像

easyVM.ini配置文件
[Memory]
;MB
Size=32

[IMG]
A=DOS.IMG
B=TC.IMG
C=
cylinders=20
heads=16
spt=63

[Boot]
Boot=A

程序流程:
WinMain
?? ?VMInit
?? ??? ?CPUInit
?? ??? ??? ?設置cpu從eCPU.cs=0xf000;eCPU.ip=0xfff0;開始執行
?? ??? ??? ?初始化InTable,和outTable
?? ??? ?malloc memory for MemoryStart
?? ??? ?read BIOS\\BiosData.bin to MemoryStart+0x400, size=0x100
?? ??? ?set boot drive
?? ??? ??? ?*(char *)(MemoryStart+0x0400+0x0100)=0 for A
?? ??? ??? ?*(char *)(MemoryStart+0x0400+0x0100)=1 for B
?? ??? ?read BIOS\\BIOS.bin to MemoryStart+0xf0000, size=
?? ??? ?DispInit
?? ??? ?PICInit();
?? ??? ?RTCInit();
?? ??? ?FloppyInit();
?? ??? ?HardDiskInit();
?? ??? ?DMAInit();
?? ??? ?PrinterInit();
?? ??? ?SerialInit();
?? ??? ?KeyBoardInit();
?? ??? ?SystemTimerInit();
?? ?VMRun
?? ??? ?CPURun:里面用一個for不斷執行
?? ??? ??? ?ExecIns
?? ??? ??? ??? ?根據當前ip:evIP得到內存中當前指令OpC
?? ??? ??? ??? ?從InsTable[Opc]得到指令對應的函數的地址
?? ??? ??? ??? ?執行該函數
?? ??? ??? ?RefreshVideoRAM

?? ?VMShutDown
?? ??? ?CPUTerminate

cpu虛擬主要文件為cpu/cpu.cpp, cpu/instructions.cpp
struct CPU 定義了cpu的所有寄存器
SetupInstructionTable用于設置InsTable,

消息響應,比如鍵盤,WM_PAINT等,在WndProc函數中(IO\Display.cpp)定義

對于顯示模塊, 用了一條IO指令來代替整個INT 10H(out?? ?0b0h,al. 在easyvmBIOS.asm說明),INT10H的具體程序在Display.cpp里實現,
函數IO_Write_00B0
?? ?

OnPaint
?? ?TextBufOut
?? ??? ?根據不同字符屬性,將顯存緩沖分成多個子字符串,分別顯示
?? ??? ?畫光標

轉載于:https://www.cnblogs.com/cutepig/archive/2009/10/01/1577146.html

總結

以上是生活随笔為你收集整理的分析easyVM 未完成)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。