当前位置:首页 > 我的程序 > 正文内容

nasm 汇编写的微码程序

Peirre3年前 (2022-04-26)我的程序419
[bits 32]

;Nasm Microcode Update 工具
;
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;                                                                                                    
;        vL  isqjIi   rs rIXjsIk  iigviiiiVdii   SJJsZLJsV   iijvr     E    U     Yi     i           
;       uBBs  bQ  B   B   XQ  Bi  viBqvrJiVqii  BRi iBi iQg  YUBSi ukiiB  iSBB sSjBBkXr iBB BB vB    
;        KP   B   B  Bid  Vv BQv   g Ii Qiiii   BgiiiBiiiQM  viBiu   i B    Bi    Bv     dq BBQBB    
;       sgBi iYiEBi  XBr  BB  iQ   B Pr iiiiv   iUi iBi iI   diZ B ii  B    Bv uDiurMB   ii i i i    
;      is Bi Bi   B  ZI   Bvg gi   vidYiEdEgv   vYvPSBuDjvv  BiR B  ii B   JQD  dv  Qi               
;      kBiE  B    B  Rrv vQ iBB    B  B  Q  B     MB B UBv   B B B sYvPBs   B    KBB                 
;      BMBQiikBBQBq ivvsiB Vg vB  JB iQ iB  Br  UQL  B   RD  B B B    iB   iB  uZk  gM               
;         irriiiiii  ii    i      virrrrrirrrr  v    r    r            i   Ji  r     ii              
;
;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;
;

;=============================
; **** 微码升级函数说明 ****
;=============================
; 微码升级函数
; 00h	返回函数支持信息
; 01h	写一个升级数据区
; 02h	全面控制读取升级
; 03h	读一个升级数据区
; int 15h 函数
;=============================

; 函数00H 测试
;=============================
; 入口
; AX 0D042H 函数代码
; BL 00H	子函数
; 出口
; CF		进位
; AH		返回代码
; AL		加OEM信息
; EBX		INTE 部分
; ECX		LPEP 部分
; EDX		读入版本
; SI		升级计数
; 返回代码
; SUCCESS	函数已经完成
; NOT_IMPLEMENTED 函数不可用
;=============================

;函数01H 写微码升级数据
;=============================
; 入口
; AX 0D042H	函数代码
; BL 01		写升级
; ES:DI		读指针模式到intel升级结构,缓冲2048字节长
;			处理器支持仅适合尺寸的微码升级
; CX		实模式64K字节RAM块1
; DX		实模式64K字节RAM块2
; SI		实模式64K字节RAM块3
; SS:SP		32k最小堆栈空间
; 出口
; CF		进位设置和清除
; AH		结构调用
; AL		加oem信息
; 返回代码
; SUCCESS			函数正确完成
; NOT_IMPLEMENTED	函数不可用
; WRITE_FAILURE		写入存储设备错
; ERASE_FAILURE		擦除存储设备错
; READ_FAILURE		读取存储设备错
; STORAGE_FULL		那是因为从BIOS系统中不能读取升级数据块
; CPU_NOT_PRESENT	当前单步处理在系统中不存在
; INVALID_HEADER	BIOS 升级头或读入版本错
; INVALID_HEADER_CS	升级求和中断
; SECURITY_FAILURE	处理弹出升级
; INVALID_REVISION

;函数02H 微码升级控制
;================================
; 入口
; AX 0D042H			函数代码
; BL 02				控制升级
; BH Task			看描述
; CX 				实模式64K字节RAM块1
; DX				实模式64K字节RAM块2
; SI				实模式64K字节RAM块3
; SS:SP 			32k最小堆栈空间
; 出口
; CF				进位设置和清除
; AH				结构调用
; AL				加oem信息
; BL				打开或关闭结构
; 返回代码
; SUCCESS			函数正确完成
; READ_FAILURE		读储存设备特性

;函数03H 读微码升级数据
;================================
; 入口
; AX 0D042H			函数代码
; BL 03				读取升级
; ES:DI				实模式指针到intel升级结构写二进制数据
; ECX 				实模式64K字节RAM块1
; ECX				实模式64K字节RAM块2
; DX				实模式64K字节RAM块3
; SI				读取升级索引块,这值基值0,必须测试函数后升级计数
; SS:SP 			32k最小堆栈空间
; 出口
; CF				进位设置和清除
; AH				结构调用
; AL				加oem信息
; BL				打开或关闭结构
; 返回代码
; SUCCESS			函数正确完成
; READ_FAILURE		读储存设备特性
; UPDATE_NUM_INVALID	升级最大数不可用
; NOT_EMPTY			指定升级块子块储存一个微码升级值
;					这指定块不是一个头块和不为空

;返回代码值
;====================================================================
;SUCCESS			00h	这函数正确完成
;NOT_IMPLEMENTED	86h	这函数不可用
;ERASE_FAILURE		90h	擦除储存设备特性
;WRITE_FAILURE		91h	写入储存设备特性
;READ_FAILURE		92h	读取储存设备特性
;STORAGE_FULL		93h	在BIOS系统中不能记录,因为可用升级块填充需要处理
;CPU_NOT_PRESENT	94h 当前单步处理在系统里不存在
;INVALID_HEADER		95h	升级头或读入版本没记录在BIOS
;INVALID_HEADER_CS	96h	升级求和值不正确
;NOT_EMPTY			9ah	指定升块记录一个升级微码块在多块
;						指定块没有头和不为空
;
;=============================
;     **** 说明结束 ****
;=============================

;===================
;功能函数返回代码值
;===================
SUCCESS				eq	00h	;这函数正确完成
NOT_IMPLEMENTED		eq	86h	;这函数不可用
ERASE_FAILURE		eq	90h	;擦除储存设备特性
WRITE_FAILURE		eq	91h	;写入储存设备特性
READ_FAILURE		eq	92h	;读取储存设备特性
STORAGE_FULL		eq	93h	;在BIOS系统中不能记录,因为可用升级块填充需要处理
CPU_NOT_PRESENT		eq	94h ;当前单步处理在系统里不存在
INVALID_HEADER		eq	95h	;升级头或读入版本没记录在BIOS
INVALID_HEADER_CS	eq	96h	;升级求和值不正确
NOT_EMPTY			eq	9ah	;指定升块记录一个升级微码块在多块

;==================
; 实模式下执行工具
;==================

datasize 	db 00000000h

header		db 48 dup (?)
mdata		db 2000 dup (?)

%define totalsize	(TotalS - DataS + 48)


ISTRUC Update
HeaderVersion		dw 0
UpdateRevislon		dw 0
Date				dw 0
ProcessorSign		dw 0
Checksum			dw 0
LoaderRevison		dw 0
ProcessorFlags		dw 0
DataSize			dw 0
TotalSize			dw 0
Reserved			dw 0,0,0
UpdateData			db 2000 dup (?)
ExtSignCount		dw 0
ExtChecksum			dw 0
Reserved1			dw 0,0,0
ProcessorSign		dw 0
ProcessorFlags		dw 0
Checksum			dw 0
IEND

; 处理信号值
;====================================
procSign:
mov eax,01
cpuid
mov ProcessorSign,eax
%if (Update.HeaderVersion == 00000001h)
; 首先检查处理信号段
	%if (ProcessorSign == Update.ProcessorSign)
		call Success
		;如果有扩展信号
	%else if (Updte.TotalSize > (Update.DataSize + 48)
			;
			;指定数据尺寸,用于计算 Update.ProcessorSign[0] 地址
			;
			%for (n=0,((N < Update.ExtSignCount) and (ProcessorSign != Update.ProcessorSign), n++)

				;
				; 如果循环计数结束,那么数字进处理信号表
				;

			%if (N < Update.ExtSignCount)
					call success
			%else
					call Fail
			%endif
			%endif
	%else
	call Fail
	%endif
%else
	Fail
%endif

	ret

Success:
	ret
Fail:
	ret


; 64 位模式
; r0 模式
;
; 处理标志测试
;======================================
procFlag:
	mov rcx,017h
	rdmsr
	shl edx,11
	shr edx,11 + 8

	mov Flag,edx
	
	; 处理标志 Flag 可能值
	; 000 处理标志 0
	; 001 处理标志 1
	; 010 处理标志 2
	; 011 处理标志 3
	; 100 处理标志 4
	; 101 处理标志 5
	; 110 处理标志 6
	; 111 处理标志 7

	%if (Update.HeaderVersion == 00000001h)
 		%if (Update.ProcessorFlags & Flag)
 			LoadUpdate
 		%else
 			;
 			; 数据尺寸用于计算升级地址,为 Update.ProcessorSignature[N]
 			; 和 Update.ProcessorSignature[N]已经正确
 			;
 		
 			%if (Update.ProcessorFlags[0] & Flag)
 				LoadUpdate
 			%endif
 		%endif
	%endif
	
	ret

; 求和测试
;==================================
micrcodeSum:
	mov N,512

	%if (Update.DataSize != 00000000h)
		div Update.TotalSize,4
		mov N,eax
	
		mov ChkSum,0
	
		for (I==0,I<N,I++)
			add ChkSum + MicrocodeUpdate[I]
		%if (ChkSum == 00000000h)
			call Success
		%else
			call Fail
		%endif
	%endif
	
	ret

; Loader 	EAX 为升级数据地址
;			EDX 为0
;			ECX 为79h (IA32_BIOS_UPDT_TRIG 地址)

; 简单的微码升级器
;====================================
MicroCodeUpLoader:
	mov ecx,79h
	xor eax,eax
	xor ebx,ebx
	mov ax,cs
	shl eax,4
	mov bx,offset Update
	add eax,ebx
	add eax,48d
	xor edx,edx
	wrmsr
	ret

; 升级保留接收汇编代码
;======================================
UpdateSign:
	mov ecx,08bh	;IA32_BIOS_SIGN_ID
	xor eax,eax		;清除 EAX
	xor edx,edx		;清除 EDX
	wrmsr			;在地址8bh读入0到MSR
	mov eax,1
	cpuid
	mov ecx,08bh	;IA32_BIOS_SIGN_ID
	rdmsr			;读指定寄存器模式

	ret

	mov z,Update.UpdateRevislon
	call UpdateSign
	mov x,edx
	
	ret 

; 编码升级
;======================================
micrcodeUpdate:
	%if (z > x)
		;读入升级
		call UpdateSign
		mov y,edx
	
		%if (z == y)
			call Success
		%else
			call Fail
		%endif
	%else
		call Fail
	%endif

	ret

1.jpeg

分享给朋友:

相关文章

随手写的时间设置程序,主要是防止系统时间无故修改。

随手写的时间设置程序,主要是防止系统时间无故修改。

程序说明:测试版程序功能。同步系统时间数据可选月历,手工输入可自动识别时间修改,修改后一分钟报警。测试版没有恢复时间功能。以后会增加。欢迎下载的朋友帮助我找程序问题,没有花多少功夫,请多多原谅。这个程...

linux 下的 opengl SDK。

linux 下的 opengl SDK。

opengl 图形库是开放式图形库,最近出了一个freeglut3 我们下载它:sudo apt-get install freeglut3sudo apt-get install freeglut3...

linux 下的《仙剑奇侠传》

linux 下的《仙剑奇侠传》

以前的DOS游戏《仙剑奇侠传》是炙制人口的一个很容易上手的游戏。这个游戏流行了很多年。很多人在玩过多年以后,重温旧梦,回味游戏之中的情感。这个游戏再版了很多次了。现在linux 下也可以直接玩这个游戏...

USB设备的插入机制与USB驱动故障。

USB设备的插入机制与USB驱动故障。

USB主机检测设备,首先在USB集线器的每个端口的D+,D-上,分别接了一个15K欧姆的下拉电阻到地。集线器端口为空时,被这两个电阻拉低了电平。在USB设备端,D+或者D- 上接了上拉1.5K电阻。全...

显微镜标定计算器,只发此处,留用备查。

显微镜标定计算器,只发此处,留用备查。

易语言写的标定计算器标定计算器.rar只限光学实验显微镜用。知道怎么用的可以选择下载。有问题请留言。显微镜标定计算器是来原于,电子目镜的标定在软件上显示很不正确。此程序只是精度高一点。这个程序是用22...

刚刚上手的一个汇编程序nasm。

刚刚上手的一个汇编程序nasm。

今天使用了masm32软件,总有使不上劲的感觉。因为intel 指令集很多都没有,自己想测试一下,一边翻资料,一边使用。windows 编程好用,但是指令不全,心里总是感觉差一点。又不是编大程序,只是...