汇编读取SMBIOS

学习SMBIOS:http://blog.csdn.net/zhoudaxia/article/details/5919699

  1 ;-------------------------------------------------
  2 ;
  3 ;程序功能: 读取SMBIOS
  4 ;运行环境: DOS + MASM5
  5 ;时间: 2015/08/27
  6 ;
  7 ;--------------------------------------------------
  8 ;
  9 echoch macro ascii
 10     mov ah,2
 11     mov dl,ascii
 12     int 21h
 13     endm
 14 ;-------------------------------------
 15     .386P
 16 ;---------------------------------------
 17 dseg segment use16
 18     buff_len = 128
 19     buff_ep db buff_len dup(0);用来存放entry point的数据
 20     ep_offset dw 0000h        ;保存ep在内存f段中的偏移地址
 21     table_add dd 00000000h    ;保存SMBIOS 表在内存中的开始地址
 22     buff_tb db buff_len dup(0);用来存放table的数据
 23 dseg ends
 24 ;
 25 ;------------------------------------------
 26 cseg segment use16
 27     assume cs:cseg, ds:dseg
 28 start:
 29     mov ax,dseg
 30     mov ds,ax
 31     ;
 32     mov ax,0f000h
 33     mov ds,ax
 34     mov si,0000h       ;从F000:[0000]开始搜索内存
 35 continue:
 36     mov eax,ds:[si]
 37     inc si
 38     cmp eax,5f4d535fh  ;比较‘ _SM_‘  ,这里不能用变量,否则loop 出错
 39     jnz continue       ;没找到,继续
 40     ;
 41     dec si
 42     mov ep_offset,si   ;ep的偏移地址保存到ep_offset 中
 43 ;
 44 ;-----------------------------------------------------
 45 ;--------------把Entry Point 存到buff_ep中-----------
 46     mov ax,0f000h           ;设置源地址
 47     mov ds,ax
 48     mov si,ep_offset
 49     ;
 50     mov ax,dseg             ;设置目的地址
 51     mov es,ax               ;段地址为数据段的段地址
 52     mov di,offset buff_ep   ;偏移地址为 buff_ep的偏移地址
 53     ;
 54     mov cx,20h              ;设置循环次数
 55     cld                     ;设置si  / di   自增
 56      repz movsb              ;字符串传送es:[di]  <-- ds:[si]  ,  cx--
 57 ;---------------------------------------------------------
 58 ;-------打印buff_ep的内容(以ascii 形式)----------------
 59     mov ax,dseg            ;设置源地址
 60     mov ds,ax              ;段地址
 61     mov si,offset buff_ep  ;偏移地址
 62         mov cx,20h             ;设置循环次数
 63         cld                    ;设置si 自增
 64 nextline1:
 65         echoch 0dh   ;换行
 66         echoch 0ah
 67         mov bp,16    ;每行显示16 字节
 68 nextch1:
 69     lodsb           ;字符串加载al <-- ds:[si]  , si++
 70     ;
 71     push ax
 72     shr al,4        ;al  的高4位移到低4位
 73     call toascii
 74     echoch al
 75     pop ax
 76     call toascii
 77     echoch al
 78     echoch ‘ ‘
 79     ;
 80     dec bp
 81         jz nextline1   ;bp == 0  ,jmp
 82     loop nextch1
 83 ;-------打印buff_ep的内容(以字符形式)------------------
 84     mov ax,dseg
 85     mov ds,ax
 86     mov si,offset buff_ep
 87         mov cx,20h
 88         cld
 89 nextline2:
 90         echoch 0dh
 91         echoch 0ah
 92         mov bp,16
 93 nextch2:
 94     lodsb
 95     echoch al
 96     dec bp
 97         jz nextline2
 98     loop nextch2
 99 ;--------------------------------------------------------------------
100 echoch 0dh
101 echoch 0ah
102 ;---------------读取SMBIOS 的表信息, 存到buff_tb-----------------------------
103     mov si,ep_offset   ;恢复ep在f段中的偏移地址
104     mov eax,[si+18h]   ;得到strucrute table address
105     ;
106     ;关于strucrute table address :
107     ;(1)如果在1M地址空间之外,需要使用保护模式来访问
108     ;(2)这里我们得到的是000e_6dc0
109     ;(3)如果strucrute table address 大于000F_FFFF,
110     ;     下面的程序就会出错,或得到的值不正确
111     ;
112     mov si,ax      ;设置源地址, si = 6dc0
113     shr eax,16     ;0000_000e
114     shl eax,12     ;0000_e000
115     mov ds,ax      ;ds = e0000
116     ;
117     mov ax,dseg             ;设置目的地址
118     mov es,ax               ;段地址为数据段的段地址
119     mov di,offset buff_tb   ;偏移地址为 buff_tb的偏移地址
120     mov cx,40h
121     cld
122      repz movsb              ;es:[di]  <-- ds:[si]  ,  cx--
123 ;---------------------------------------------------
124 ;------打印buff_tb的内容(以ascii 形式)--------------
125     mov ax,dseg
126     mov ds,ax
127     mov si,offset buff_tb
128         mov cx,40h
129         cld
130 nextline3:
131         echoch 0dh
132         echoch 0ah
133         mov bp,16
134 nextch3:
135     lodsb
136     ;
137     push ax
138     shr al,4
139     call toascii
140     echoch al
141     pop ax
142     call toascii
143     echoch al
144     echoch ‘ ‘
145     ;
146     dec bp
147         jz nextline3
148     loop nextch3
149 ;------打印buff_ep的内容(以字符形式)---------------
150     mov ax,dseg
151     mov ds,ax
152     mov si,offset buff_tb
153         mov cx,40h
154         cld
155 nextline4:
156         echoch 0dh
157         echoch 0ah
158         mov bp,16
159 nextch4:
160     lodsb
161     echoch al
162     dec bp
163         jz nextline4
164     loop nextch4
165 ;------------------------------------------------
166 ;---------------返回 dos-----------
167         mov ah,4ch
168         int 21h
169 ;----------------------------------------
170 ;函数功能:把al 的低4位转成ascii码,并存入al
171 ;入口参数: al
172 ;出口参数: al
173 toascii proc
174     and al,0fh  ;高四位清零
175     add al,90h  ;1001_xxxx
176     daa
177     adc al,40h
178     daa
179     ret
180 toascii endp
181 ;-------------------------------------------
182 cseg ends
183     end start
时间: 2024-10-16 23:23:11

汇编读取SMBIOS的相关文章

汇编读取PCI配置空间

学习PCI:http://blog.sina.com.cn/s/articlelist_1685243084_3_1.html 1 ;------------------------------------------------ 2 ; 3 ;程序功能: 读取PCI 配置信息,存入文件zpci_config.txt 4 ; 通过端口CF8h / CFCh 来读取 5 ;运行环境: DOS + MASM5 6 ;时间: 2015/08/25 7 ; 8 ;--------------------

汇编读取CMOS RAM端口程序

题目:按照主程序与子程序的结构,输入并编写读出CMOS RAM端口程序,以"年/月/日 时:分:秒"的格式,显示当前时间. 源程序: assume cs:code,ds:data data segment db 9,8,7,4,2,0 ;储存各时间位置 db "yy/mm/dd hh:mm:ss",0 ;输出格式 data ends code segment start: mov ax,data mov ds,ax ;data段挂载到ds mov bx,0 ;bx初

新年特别奉献:(原创)全自动共享软件破解器4.8

原创:全自动共享软件破解器4.8 作者:发威时刻  原创:梦幻软件天堂       全自动共享软件破解器(可执行文件修改精灵),是逆向爱好者发威时刻同学(魔界天尊-:)凭借个人幻想设计出来的一款全新自动化破解工具,全方位利用各种汇编工具的各自特点杂交而成的自动动化破解工具,极大可能的模仿人类破解的流程猜测性的来尝试性破解,让软件自动化的穷举各种汇编指令从而修改汇编代码,制作的一款小工具.该工具制作用了前后差不多六个月时间,尚有很多不足的地方,所以我们要不断来升级和完善它,希望给您带来学习和逆向分

用java做操作系统内核:软盘读写

在前两节,我们将一段代码通过软盘加载到了系统内存中,并指示cpu执行加入到内存的代码,事实上,操作系统内核加载也是这么做的.只不过我们加载的代码,最大只能512 byte, 一个操作系统内核,少说也要几百兆,由此,系统内核不可能直接从软盘读入系统内存. 通常的做法是,被加载进内存的512 Byte程序,实际上是一个内核加载器,它运行起来后,通过读取磁盘,将存储在磁盘上的内核代码加载到指定的内存空间,然后再把cpu的控制权提交给加载进来的系统内核. 这就需要我们理解软盘的物理结构,以及软盘的数据读

SSDT表的遍历

//VS2005创建的工程,系统xp sp2 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //stdafx.h文件 #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to

IDT HOOK思路整理

IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后,可以写代码了 首先获取到IDT,这个需要使用汇编指令sidt来获取,这个指令读取了IDTR寄存器的内容,返回结构的格式为: typedef struct P2C_IDTR_ { P2C_U16 limit; // 范围 P2C_U32 base; // 基地址(就是开始地址) } P2C_IDTR

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

C编译器剖析_1.5 结合C语言来学汇编_指针、数组和结构体

让我们再来看一份C代码,及其经UCC编译器编译后产生的主要汇编代码,如图1.33所示,其中包含了数组.指针和结构体. 图1.33 数组.指针和结构体 按照C的语义,图1.33第9行的C代码是对局部数组number的初始化,需要把number[0]初始化为2015,而数组中的其他元素皆被初始化为0.UCC编译器采取的翻译方法是:先调用memset函数来把数组number所占的内存空间清0,然后再把number[0]设为2015,如图1.33的第17至24行所示.C库函数memset的API如下所示

GCC内嵌AT&amp;T汇编语法

一 基本语法 1 寄存器引用 引用寄存器要在寄存器号前加百分号%,如"movl %eax, %ebx". 80386有如下寄存器: 1.8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp: 2.8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp: 3.8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl.它们事实上是寄