【我所認知的BIOS】->汇编语言之宏汇编2

【我所認知的BIOS->汇编语言宏汇编1 【我所認知的BIOS->汇编语言宏汇编1By LightSeed2010-2-2  其实早就想写点关于汇编语言的文章了,但是最近感觉比较累,自己也比较懒今天才动手写。哎。。。真是身心俱疲,房价涨了,小菜也涨了,妹儿的要求也涨了,但是哥的工资还是不涨。这社会我快混不下去了。但是想想做男人嘛,有什么大不了的。做人,最重要的是心态要好,要稳。1、我体会到的C和汇编目前我还做的le 阅读详情

【我所認知的BIOS->汇编语言之宏汇编2

By LightSeed

2010-2-3  

在上一节详细讲了宏汇编的理论,那这节来聊聊我在仿写ADU的时候用的一些宏汇编的例子吧。有了下面这个串宏汇编,那么程序的可维护性就高了很多,在添加或者删除这个工具的功能的时候,就显得格外简单和高级语言写出来的工具的健壮性可媲美。这也是我对这个工具感觉做的最好的地方之一,和大家share一下。(不过这个算法是仿照award biossetup下面的菜单来做的。)

代码如下:

1、主要宏

;-------------------------------------------------------------------------

;******* By LightSeed

;******* lightseed@163.com

;******* 2010-2-3

;

;Macro name:  CreateMainItem

;input    :

;   Name       :Name of this item

;   MorS       :mainmenu or submenu

;   IBT    :item belong to (which item 1,2..8 etc)

;   ORD    :item order in its menus 0~8 for main item,9~255 for subitem

;   MaxSubNum  :the highest value of submenu

;   MaxSubMenuStrNum:the number of submenu's string.

;   MaxStrNum  :the maximal number of strings to display

;   IsHighLit  :set if it is choosed

;   SubitemNum :the number of subitem

;   Attrib     :attribute of this main item

;   X_axis     :row number in window under DOS

;   Y_axis     :line number in window under DOS

;   _item_str  :offset address of strings to display

;

;ex :

;   Name       =xxxx  will be created ' xxxx_item lable near'

;   MorS       =00h   means mainmenu,

;          01h   submenu

;          others reserved

;   IBT    when it is mainmenu,IBT no use

;          when it is submenu,IBT belong to 1--F1,2--F2...etc

;   ORD    =00h   default to order

;          =01h   means the first order

;          ...

;   MaxSubNum  =04h   means it can be defined 4 subitems at most

;   MaxStrNum  =05h   means it can be defined 5 strings to be displayed

;   IsHighLit  =01H   have been highlight

;   SubitemNum =0h have no subitem

;   Attrib     =00011110b blackgroud:blue front:yellow

;   X_axis    

;   Y_axis

;   _item_str  xxxxxh offset address

;

;remark:   there will be define a set of structure ,4 data will be filled soon

;      this macro must be defined with Create_String and EndCreateItem_Str.

;      because,there are some parameters should be put

;      ex:

;      CreateMainItem xx,xx,xx,xx,...

;      Create_String  xx_label

;      db x,x,x,x,x,x

;      EndCreateItem_Str

 

;-------------------------------------------------------------------------

 

CreateMainItem macro Name,MorS,IBT,ORD,MaxSubNum,MaxSubMenuStrNum, MaxStrNum,IsHighLit,SubitemNum,Attrib,X_axis,Y_axis,_item_str

 

    Check_Input_Error Name,%IBT,%MaxSubNum,%MaxStrNum,%MorS

 

    Create_Item_Content  Name, %MorS, %IBT, %ORD, %MaxSubNum,/

              %MaxStrNum,%IsHighLit,%Attrib,%Item_Num,%SubitemNum

   

    db  Name&_MorS

    db  Name&_IBT 

    db  Name&_ORD 

    db  Name&_MaxSubNum

    db  MaxSubMenuStrNum

    db  Name&_MaxStrNum  

    db  Name&_IsHighLit  

    db  Name&_SubitemNum

    db  Name&_Attrib

    db  Name&_Str_Itm_Num    ;Display_String_Num,will be place here

    db  Y_axis     ;Yaxis

    db  X_axis     ;Xaxis

    dw  offset Name&_Str     ;offset address Display string

 

    endm;CreateMainItem

 

上面的这个宏的功能主要是创建一个结构体,这个结构体是对每个出现在工具中的item做各个属性的定义的。可以说,这个结构体是画工具界面的主要参数。对于这个创建结构体的宏,内部结构又分三个部分。

①对输入的各个参数进行校验,如果出错则输出错误提示信息,编译停止。

②经过第一个宏的check后,说明输入数据均是有效的,进而调用另外一个宏来创建一些数据(因为实际输入的数据有些需要进行计算后才填入到结构体中去。这里计算出来的数据均是全局常量,方便在第三部分直接用数据。如果这个定义的数据不放在第二部分的话,那么第三部分在引用这些常量的时候就出错。)。

③经过前面两个宏的处理后,对应的数据定义好了(在第二部分中处理好的),直接定义结构体内容。

在这个宏里,我们充分看到了在上一节中说的那些宏嵌套和参数引用等问题。

2、检验(数据)宏

代码如下:

;******* By LightSeed

;******* lightseed@163.com

;******* 2010-2-3

 

 

Check_Input_Error macro item_Name,Item_Bel_To,Max_Sub_Num, Max_Str_Num,main_or_sub

 

    ;----- if item_Name not declared, then force error -----

    ifb <item_Name>

       %out

       %out item_Name do not declared!

       .ERR

    ENDIF

 

    ;----- if IBPT not declared, then force error -----

    ifb <Item_Bel_To>

       %out

       %out where the item belong and point do not declared!

       .ERR

    ENDIF

 

    ;----- if MaxSubNum not declared, then force error -----

    ifb <Max_Sub_Num>

       %out

       %out MaxSubNum not declared!

       .ERR

    ENDIF

 

    ;----- if MaxStrNum not declared, then force error -----

    ifb <Max_Str_Num>

       %out

       %out MaxStrNum not declared!

       .ERR

    ENDIF

 

    ;----- if main_or_sub not declared, then force error -----;

    ifb <main_or_sub>

       %out

       %out main_or_sub not declared!

       .ERR

    ENDIF

   

 

    endm;Check_Input_Error

对于这个宏,其实我只想说明一点,应该说把上一节的条件汇编用在了这里。

3、处理(数据)宏

代码如下:

;-------------------------------------------------------------------------

;******* By LightSeed

;******* lightseed@163.com

;******* 2010-2-3

;

;

;

;Macro name:  Create_Item_Content

;input    :

;

;   Name       =xxxx  will be created ' xxxx_item label near'

;   MorS       =00h   mainmenu

;          =01h   submenu

;   IBT    =00h   means mainmenu,

;          01h   submenu

;          others reserved

;   ORD    =00h   default to order

;          =01h   means the first order

;

;   MaxSubNum  =04h   means it can be defined 4 subitems at most

;   MaxStrNum  =05h   means it can be defined 5 strings to be displayed

;   IsHighLit  =01H   have been highlight

;   Attrib     =00011110b blackgroud:blue front:yellow

 

;-------------------------------------------------------------------------

 

Create_Item_Content  macro    Name,MorS,IBT,ORD,MaxSubNum,MaxStrNum,IsHighLit,Attrib,CurrentItemNum,SubitemNum

   

    _MorS      = MorS

    _IBT       = IBT

    _ORD       = ORD

    _MaxSubNum = MaxSubNum

    _MaxStrNum = MaxStrNum

   

    ;qe'=' gt'>' lt'<' ge'>=' le'<='

    ;when you create a main menu,counter ++

    if  _MorS  eq  0

    _TotalMainMenuNum = _TotalMainMenuNum+1  ;

    endif

 

    ;if _TotalMainMenuNum > the highest value then force error

    if _TotalMainMenuNum gt MaxMainMenuNum

       %out

       %OUT   The number of mainmenu too large

       .ERR

 

    endif

    ;if _MaxSubNum > the highest value then force error

    if  _MaxSubNum gt MaxSubMenuNum

       %out

       %OUT   The number of submenu too large

       .ERR

 

    endif;_MaxSubNum gt MaxSubMenuNum

 

    ;if order > the highest value then force error

    if  _MorS  eq  0          ;if mainmenu?

      

       if  _ORD   gt  MaxMainMenuNum   

           %out

           %OUT   The order of mainmenu too large

           .ERR

       endif; _ORD   gt  MaxMainMenuNum

    else ;_MorS   eq  0          ;it is submenu

       if  _ORD   gt  MaxSubMenuNum

           %out

           %OUT   The order of submenu too large

           .ERR

       endif; _ORD   gt  MaxSubMenuNum

    endif;_MorS   eq  0

   

 

       public Name&_item

    Name&_item Label  Near   ;create the item

 

    ifndef Name&_MorS

       Name&_MorS equ MorS

    endif

    ifndef Name&_IBT

       Name&_IBT  equ IBT

    endif

    ifndef Name&_ORD

       Name&_ORD  equ ORD

    endif 

    ifndef Name&_MaxSubNum

       Name&_MaxSubNum   equ MaxSubNum

    endif 

    ifndef Name&_MaxStrNum

       Name&_MaxStrNum   equ MaxStrNum

    endif 

    ifndef Name&_IsHighLit

       Name&_IsHighLit   equ IsHighLit

    endif

    ifndef Name&_SubitemNum

       ifb <SubitemNum>

           Name&_SubitemNum  equ    0

       else  

           Name&_SubitemNum  equ SubitemNum

       endif;<SubitemNum>

    endif

    ifndef Name&_Attrib

       Name&_Attrib  equ Attrib

    endif

    ifndef Name&_Str_Itm_Num

       Name&_Str_Itm_Num equ Name&_str_&CurrentItemNum

    endif

 

 

    ;define offset item

    OffsetAddress&CurrentItemNum    equ offset Name&_item

    endm;Create_Item_Content

这个宏,看上去很代码很多,其实看清庐山真面目了以后就感觉很简单。那么我就简单说说看这个宏的时候,应该注意的几个问题:

①用“=”定义的是一个变量,它可以在宏计算的时候当一个变量来使用,可以被重新赋值。而用“EQU”定义的是一个常量,是不能够加减重新赋值的。

②“&”是个连接符,它的作用其实就是为了让变量或者常量看起来,或者说操作起来更直观易懂。

③条件汇编在这个宏里用的最多。总的来说,其实这个宏都只是定义了一些常量来供主宏来定义结构体罢了。从这个角度上看,这些定义的常量就类似于函数的输出了。只是中间的逻辑稍微不那么直观而已。

 

关于宏汇编的东西,我就和大家讲这么两个小节,而且主要是围绕我写的那个工具中用到的宏汇编来写的。(不过我想能够融会贯通这些宏的使用的话,也应该够用了吧。呵呵。。。毕竟人家BIOS也就用了这些嘛。)如果您对此还有什么疑问的话,我们可以再深入交流。

 

汇编语言定义宏指令--.macro 在这个例子中,我们定义了一个名为`ZeroMemory`的宏,它接受两个参数:目标内存地址`dst`和要清零的长度`len`。在实际代码中,通过调用`ZeroMemory myArray, 100`,实现了对`myArray`这块内存区域的清零操作。`.macro` 是汇编语言中用于定义宏的指令,它允许程序员创建可复用的代码模板,从而提高代码的可读性、减少重复并便于维护。- 宏体中的标签(如循环标签`1:`)在每次宏调用时应当是唯一的,以避免标签重定义错误。- `macro_name` 是宏的名称。 阅读详情

相关推荐

汇编语言编写的读取BIOS设置CMOS信息的程序(含源代码)

自己编写的用汇编语言读取BIOS设置CMOS信息的程序(含源代码),分两个版本:动态版和静态版,能读取即时信息或随时间改变的动态信息

[汇编语言]宏汇编

使用宏汇编语句,可以减少程序书写错误,缩短源程序长度长度。宏:宏指令:宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对伪指令MACRO和ENDM完成。 格式: 宏名 MACRO [哑元1,哑元2,…] 语句串 ENDM 说明:语句串代表宏定义体。宏定义并不产生目标代码,只是用来说明“宏名字”与宏定义体之间的联系。其中哑元1,哑元2,… 是虚拟参数或称形式参数,用逗号分隔。虚参(形参)可不设置。 宏定义之后,要在程序中使用宏时,只要写出宏名字即可。使用宏的过程称为宏调用。如宏

qq_51533157的博客 7721

dos经典-masm宏汇编

经典的dos时代的汇编语言编译工具,需要的可能下载使用

汇编--学习笔记(十四)-高级汇编技术--

为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。 一、宏汇编 二、重复汇编 三、条件汇编 一、宏汇编1、宏:源程序中一段具有独立功能的程序代码。 2、宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。 汇编语言程序 指令 伪指令(伪操作) 宏指令 一、宏定义MACRO_NAME MACRO [亚元表] ;形参、虚参 [LOCAL 标号表]

似水流年 2133

宏汇编macro

一、宏汇编 宏定义是用一组伪操作来实现的。其格式是: macro_name MACRO [dumny_parameter_list] ... (宏定义体) ENDM 其中MACRO和ENDM是一对伪操作.这对伪操作之间是宏定义体--是一组独立功能的程序代码.宏指令名(macro_name)...

EE漫谈 2万+

017-汇编语言中的宏

宏是预先定义的指令序列,在汇编过程中,宏调用会被替换为其定义的指令序列。与函数不同,宏在汇编时展开,而不是在运行时调用,因此不涉及运行时的栈操作和返回地址管理。最基本的宏是不带参数的简单文本替换:assembly;NASM语法单行宏定义带参数的单行宏;MASM语法等效于NASM的%define带参数的多行宏DB msg, 0ENDM;GAS语法.endm.endm复杂的宏通常包含多行代码:assembly;NASM语法push raxpush rbxpush rcx。

小宝哥Code的专栏 1448

汇编宏汇编、宏库

宏名 MACRO [参数1, 参数2,...];宏体(汇编指令)[EXITM];可选:提前退出宏ENDM在汇编语言中,宏是一种由程序员定义的“伪指令”,它不是一条 CPU 指令,而是在汇编阶段被展开为若干条真实指令的模板。;定义一个宏:显示字符INT 21HENDMINT 21H。

u011911064的博客 509

.o0博客导读0o. 12/13/2010最后更新

寫在前面 一直以來其實沒有開博的打算,但是今天我發自內心寫這份blog。我是一個工作在工控機廠商的BIOS工程師,在這裡我談談我的寫的原因和目的。 原因:主要還是各個前輩影響了我。本身我剛剛從事工作崗位才一年不到的時間,工作于BIOS行業。然而這個行業的資料卻是罕見的少,幾乎在市面上找不到像樣的書籍或者是學習資料。除了從師父那裡獲取信息之外基本上都是看網路上各位前輩的留下的blo...

insertyou 129

8086汇编——宏汇编及多模块技术

一、宏 1.宏定义 宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对伪指令MACRO和ENDM完成。 格式: 宏名 MACRO [哑元1,哑元2,...] 语句串 ENDM 说明:语句串代表宏定义体。宏定义并不产生目标代码,只是用来说明“宏名字”与宏定义体之间的联系。其中哑元1,哑元2,… 是虚拟参数或称形式参数,用逗号分隔。虚参(形参)可不设置。 2.宏调运 宏定义之后,要在程序中使用宏时,只要写出宏名字即可。使用宏

一枚菜鸡 4253

宏汇编软件MASM51使用指南.pdf

宏汇编软件MASM51使用指南pdf,宏汇编软件MASM51使用指南

宏汇编,主要就是介绍的宏汇编

这是一个详细介绍宏汇编的教程,让你能够对宏汇编有更深刻的了解,有助于汇编学习!

宏汇编MASM5.1

属于比较全面的传感技术讲义,内容丰富详细,对复习帮助很大

宏汇编语言的基本语法

常数、变量和标号 1、常数 (1)二进制数:以字母B结尾的由一串 ‘0’ 和 ‘1’ 组成的序列。 (2)八进制数:以字母o或Q结尾,由若干个0到7的数字组成的序列 (3)十进制数:由若干0到9的数字组成的序列,可以以字母D结尾,也可以省略字母D。 (4)十六进制数:以字母H结尾。且必须以数字开头。例如:0B3FH (5)字符串常数:用引号括起来的一个或多个字符。这些字符以ASCII码形式存在内存中。 2、变量(偏移量的标号) 变量的三个属性: (1)段属性(SEGMENT...

Anpache的博客 918

宏汇编语言汇编语言有什么区别

List item 宏是一种伪指令,在编译的时候由编译器翻译成相应的汇编指令然后生成.OBJ文件,宏不能对硬件进行控制,只对编译器有作用。其实理解了伪指令和机器指令的区别就是你这个问题的区别 宏汇编属于汇编语言宏汇编本人理解就是再给取个名,便于编写程序。 例如某人叫二狗子,签名时候写二狗子不行(叫二狗子的太多了),就要取个大名,但得到公安局登记。宏汇编就相当于公安局。 ...

qq_40627648的博客 1952

汇编语言——宏汇编

汇编语言——宏汇编 MWhite关注 2017.12.20 20:49:12字数 614阅读 393 标识符字段 操作符字段 指令助记符 伪指令助记符 操作数字段 注释字段 1. 运算符 算术运算符 数值表达式中可用所有运算 地址表达式中只可用+ - 逻辑运算符 and or 关系运算符 关系满足则返回全1,否则返回全0 源文件中写 MOV AX,...

二进制模----细微行动改变影响世界 1179

汇编——宏应该怎么写

什么是宏

筱羊冰冰 4631
上一篇: 【我所認知的BIOS】->汇编语言之宏汇编1
下一篇: DDR2 DIMM SPD Definition
lightseed
博客等级 码龄17年 1015粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值