标签 汇编 下的文章
 2018-12-17T20:27:18.694000    |      实用技巧    |     AilsonJack    |     暂无评论    |     2535 views
最近在学习x86汇编语言,寻思着使用Sublime来编辑汇编代码,并且通过Sublime来编译写好的程序,这样编辑和编译就非常的方便了。这里我是在Windows 7中使用nasm编译器,Sublime的版本是Sublime Text3。在文章《Sublime 高亮汇编asm文件》中讲述了Sublime高亮asm汇编代码的方法。本文就重点讲解在编写好汇编代码之后,如何通过Sublime调用nasm编译器来编译我们的程序,当然调用过程就是按一下快捷键即可。下面讲解如何将我们的编译配置文件导入到Sublime。  下面内容会使用到的文件,这里我通过网盘进行分享: 点此下载 密钥:wanq。1、安装nasm从网上下载nasm编译器的安装包,然后安装到系统中,安装完成之后,可以命令窗口中执行命令:nasm -v,如果输出了nasm的版本信息,那么就表示nasm安装成功;如果没有输出版本信息,那么可以将nasm安装目录(nasm.exe所在的路径)添加到系统环境变量中,之后再重新打开命令窗口,输入命令:nasm -v,应该就可以正确的输出nasm的版本信息。2、使用配置文件打开Sublime,然后选择Preferences -> Browse Packages…,然后将我提供的nasm.sublime-build文件放入弹出的文件框的User文件夹中,然后可以关闭窗口,之后重启Sublime,可以在Tools -> Build System中看到刚才安装的编译工具nasm:3、编译汇编程序Sublime打开汇编程序,然后可以试试按快捷键Ctrl+B,可以看到汇编程序代码所在的目录生成了编译好的文件:至此就完成了Sublime编译汇编程序的功能,如有疑问欢迎留言。
Sublime实用技巧汇编 阅读全文»
 2018-12-09T19:13:51.485000    |      实用技巧    |     AilsonJack    |     暂无评论    |     2649 views
今天给大家讲讲如何让Sublime高亮汇编代码文件,这样看起来也舒服不少。我使用的是Sublime Text 3.0,高亮的汇编代码文件的后缀为.asm。下面进入正题。首先打开Sublime,然后点击Preference -> Package Control,然后点击Package Control:Install Package进入安装包选项,之后在输入框中输入x86,然后选择x86 and x86_64 Assembly进行安装,安装完成之后重启Sublime,然后随便打开一个以.asm为后缀的汇编代码文件,可以看到汇编代码中的关键字高亮啦。
Sublime实用技巧汇编 阅读全文»
 2018-11-15T19:14:34.396000    |      汇编    |     AilsonJack    |     暂无评论    |     1115 views
BIOS int 13H中断也叫直接磁盘服务(Direct Disk Service),该中断的各个功能号及对应的功能描述如下:功能号功能描述功能号功能描述00H磁盘系统复位01H读取磁盘系统状态02H读扇区03H写扇区04H检验扇区05H格式化磁道06H格式化坏磁道07H格式化驱动器08H读取驱动器参数09H初始化硬盘参数0AH读长扇区0BH写长扇区0CH查寻0DH硬盘系统复位0EH读扇区缓冲区0FH写扇区缓冲区10H读取驱动器状态11H校准驱动器12H控制器RAM诊断13H控制器驱动诊断14H控制器内部诊断15H读取磁盘类型16H读取磁盘变化状态17H设置磁盘类型18H设置格式化媒体类型19H设置磁盘类型1AH格式化ESDI驱动器1、功能 00H功能描述:磁盘系统复位入口参数:AH=00HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明2、功能 01H功能描述:读取磁盘系统状态入口参数:AH=01HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:AH=00H,AL=状态代码,其定义如下:00H — 无错 01H — 非法命令02H — 地址目标未发现 03H — 磁盘写保护(软盘)04H — 扇区未发现 05H — 复位失败(硬盘)06H — 软盘取出(软盘) 07H — 错误的参数表(硬盘)08H — DMA越界(软盘) 09H — DMA超过64K界限0AH — 错误的扇区标志(硬盘) 0BH — 错误的磁道标志(硬盘)0CH — 介质类型未发现(软盘) 0DH — 格式化时非法扇区号(硬盘)0EH — 控制数据地址目标被发现(硬盘) 0FH — DMA仲裁越界(硬盘)10H — 不正确的CRC或ECC编码 11H — ECC校正数据错(硬盘) CRC:Cyclic Redundancy Check code ECC:Error Checking & Correcting code20H — 控制器失败 40H — 查找失败80H — 磁盘超时(未响应) AAH — 驱动器未准备好(硬盘)BBH — 未定义的错误(硬盘) CCH — 写错误(硬盘)E0H — 状态寄存器错(硬盘) FFH — 检测操作失败(硬盘)3、功能 02H功能描述:读扇区入口参数:AH=02HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明4、功能 03H功能描述:写扇区入口参数:AH=03HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明5、功能 04H功能描述:检验扇区入口参数:AH=04HAL=扇区数CH=柱面CL=扇区DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=被检验的扇区数,否则,AH=状态代码,参见功能号01H中的说明。6、功能 05H功能描述:格式化磁道入口参数:AH=05HAL=交替(Interleave)CH=柱面DH=磁头DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘ES:BX=地址域列表的地址出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明。7、功能 06H功能描述:格式化坏磁道入口参数:AH=06HAL=交替CH=柱面DH=磁头DL=80H~0FFH:硬盘ES:BX=地址域列表的地址出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明8、功能 07H功能描述:格式化驱动器入口参数:AH=07HAL=交替CH=柱面DL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明9、功能 08H功能描述:读取驱动器参数入口参数:AH=08HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明,否则,BL=01H — 360K=02H — 1.2M=03H — 720K=04H — 1.44MCH=柱面数的低8位CL的位7-6=柱面数的该2位CL的位5-0=扇区数DH=磁头数DL=驱动器数ES:DI=磁盘驱动器参数表地址10、功能 09H功能描述:初始化硬盘参数入口参数:AH=09HDL=80H~0FFH:硬盘(还有有关参数表问题,在此从略)出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明11、功能 0AH功能描述:读长扇区,每个扇区随带四个字节的ECC编码入口参数:AH=0AHAL=扇区数CH=柱面CL=扇区DH=磁头DL=80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明12、功能 0BH功能描述:写长扇区,每个扇区随带四个字节的ECC编码入口参数:AH=0BHAL=扇区数CH=柱面CL=扇区DH=磁头DL=80H~0FFH:硬盘ES:BX=缓冲区的地址出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明13、功能 0CH功能描述:查寻入口参数:AH=0CHCH=柱面的低8位CL(7-6位)=柱面的高2位DH=磁头DL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明14、功能 0DH功能描述:硬盘系统复位入口参数:AH=0DHDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明15、功能 0EH功能描述:读扇区缓冲区入口参数:AH=0EHES:BX=缓冲区的地址出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明16、功能 0FH功能描述:写扇区缓冲区入口参数:AH=0FHES:BX=缓冲区的地址出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明17、功能 10H功能描述:读取驱动器状态入口参数:AH=10HDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明18、功能 11H功能描述:校准驱动器入口参数:AH=11HDL=80H~0FFH:硬盘出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明19、功能 12H功能描述:控制器RAM诊断入口参数:AH=12H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明20、功能 13H功能描述:控制器驱动诊断入口参数:AH=13H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明21、功能 14H功能描述:控制器内部诊断入口参数:AH=14H出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明22、功能 15H功能描述:读取磁盘类型入口参数:AH=15HDL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明, 否则,AH=00H — 未安装驱动器=01H — 无改变线支持的软盘驱动器=02H — 带有改变线支持的软盘驱动器=03H — 硬盘,CX:DX=512字节的扇区数23、功能 16H功能描述:读取磁盘变化状态入口参数:AH=16HDL=00H~7FH:软盘出口参数:CF=0——磁盘未改变,AH=00H,否则,AH=06H,参见功能号01H中的说明24、功能 17H功能描述:设置磁盘类型入口参数:AH=17HDL=00H~7FH:软盘 AL=00H — 未用=01H — 360K在360K驱动器中=02H — 360K在1.2M驱动器中=03H — 1.2M在1.2M驱动器中=04H — 720K在720K驱动器中出口参数:CF=0——操作成功,AH=00H,否则,AH=状态编码,参见功能号01H中的说明25、功能 18H功能描述:设置格式化媒体类型入口参数:AH=18HCH=柱面数CL=每磁道的扇区数DL=00H~7FH:软盘出口参数:CF=0——操作成功,AH=00H,ES:DI=介质类型参数表地址,否则,AH=状态编码,参见功能号01H中的说明26、功能 19H功能描述:磁头保护,仅在PS/2中有效,在此从略27、功能 1AH功能描述:格式化ESDI驱动器,仅在PS/2中有效,在此从略
汇编中断Linux 阅读全文»
 2018-11-05T19:26:30.281000    |      汇编    |     AilsonJack    |     暂无评论    |     3069 views
在Linux 0.00的boot.s中,为了改变CS的值,操作的方法如下所示:那么可以通过mov指令直接修改CS的内容吗,即如下:答案当然是不可以的,CS和IP是8086 CPU中2个最关键的寄存器。它们指示了要读取指令的地址。大部分8086 CPU寄存器的值,都可以使用mov指令来改变,但CS、IP中的值不能用mov指令来修改。能够改变CS、IP寄存器内容的指令称为转移指令。一个最简单的可以修改它们的指令,就是上面用的 jmp 指令。jmpi  0, 0x9000h表示间接跳转(相当于跳到另一个段去开始执行), 即程序跳到9000:0 去继续执行了。
汇编 阅读全文»
 2018-09-11T06:34:59.960000    |      汇编    |     AilsonJack    |     暂无评论    |     1360 views
int 10H 是BIOS对屏幕及显示器所提供的服务程序。使用int 10H中断服务程序时,先要进行一些简单的配置,比如指定功能号和子功能号。其中寄存器AH表示的就是功能号,而其他寄存器的详细说明,参考表格中对应功能的文字,当一切设定好之后再调用 int 10H。下面是可供参考的表格:AH功能调用参数返回参数/注释01H设置光标类型设置光标类型CH低四位=光标的起始行CL低四位=光标的终止行02H设置光标位置BH=显示页码DH=行(Y坐标)DL=列(X坐标)03H读光标位置BH=显示页码CH=光标的起始行CL=光标的终止行DH=行(Y坐标)DL=列(X坐标)04H获取当前状态和光笔位置AH=00h—光笔未按下/未触发,01h—光笔已按下/已触发BX=象素列(图形X坐标)CH=象素行(图形Y坐标,显示模式:04H~06H)CX=象素行(图形Y坐标,显示模式:0DH~10H)DH=字符行(文本Y坐标)DL=字符列(文本X坐标)05H设置显示页,即选择活动的显示页AL=显示页06H屏幕初始化或上卷AL = 上卷行数AL = 0全屏幕为空白BH = 卷入行属性CH = 左上角行号CL = 左上角列号DH = 右下角行号DL = 右下角列号07H屏幕初始化或下卷AL = 下卷行数AL = 0全屏幕为空白BH = 卷入行属性CH = 左上角行号CL = 左上角列号DH = 右下角行号DL = 右下角列号08H读光标位置的属性和字符BH=显示页码AH=属性AL=字符09H在当前光标处按指定属性显示字符AL=字符BH=显示页码BL=属性(文本模式)或颜色(图形模式)CX=重复输出字符的次数0AH在当前光标处按原有属性显示字符AL=字符BH=显示页码BL=颜色(图形模式,仅适用于PCjr)CX=重复输出字符的次数0EH显示字符(光标前移)AL=字符BH=页码BL=前景色(图形模式)13H显示字符串BH=页码BL=属性(若AL=00H或01H)CX=显示字符串长度(DH、DL)=坐标(行、列)ES:BP=显示字符串的地址AL= 显示输出方式0:字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变 1:字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变 2:字符串中含显示字符和显示属性。显示后,光标位置不变 3:字符串中含显示字符和显示属性。显示后,光标位置改变AH=00H是用来设定显示模式的,AL 寄存器表示欲设定的模式:AL文字/图形分辨率颜色00H文字40*252色01H文字40*2516色02H文字80*252色03H文字80*2516色04H图形320*2002色05H图形320*2004色06H图形640*2002色AH=01H,你可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。光标起始处与终止处分别由 CL 与 CH 的 0 到 4 位表示,而 CH 的第 7 位必须是 0,第 5、6 位表示光标属性:位6位5属性00正常01隐形10erratic11闪烁缓慢AH=02H,此功能是设定光标位置,位置用 DH、DL 表示,DH 表示列号,DL 表示行号。由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠第零行右边的一行为第一行。故最左边,最上面的位置为 DH=0 且 DL=0;最左边第二列,DH=1,DL=0。如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为 0。在文字模式下,字符的位置类似数学直角坐标系的坐标,但是 Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到 24 为止,存于 DH 内。X 轴和直角座标系相同,越右边越大,存于 DL 内,其最大值视显示模式而变。AH=03H,用于读取光标位置,在这个中断服务程序返回时,会将光标的行列信息存储在DX里面,CX中存储光标的开始行和结束行。AH=04H,此功能是探测光笔的位置,似乎只有 CGA 卡有接上光笔??AH=05H,这个功能是把指定的显示页显示于屏幕上,欲显示的显示页由AL寄存器指定。此功能只能在文字模式下才能发生作用。AH=06H/07H,这个服务程序的作用是把某一个设定好的矩形区域内的文字向上或向下移动。先说明向上移动,即AH=06H。当此服务程序工作时,会使矩形区域的文字向上移动,而矩形区域底端移进空格列。向上移动的列数存入 AL 中 ( 如果 AL 为零,表示使矩形区域的所有列均向上移 ),底端移入空格列的属性存于 BH,矩形区域是藉由 CX、DX 来设定左上角与右下角的座标,左上角的行与列分别由 CL、CH 设定,右下角的行与列由 DL、DH 设定。AH=07H和 AH=06H相似,只是卷动方像不同而已。AH=08H,这个服务程序是用来取得光标所在位置的字符及属性,调用前,BH表示想要读取的显示页,返回时,AL为该位置的ASCII字符,AH为其属性,有关属性的说明,请参考下面的注1。AH=09H,这个功能是在光标位置显示字符,所要显示字符的 ASCII 码存于 AL 寄存器,字符重复次数存于 CX 寄存器,显示页存于 BH 寄存器,属性存于 BL 寄存器,其属性使用与AH=08H一样。AH=0AH,这个功能和AH=09H一样,差别在 AH=0AH 只能写入一个字符,而且不能改变字符属性。AH=0BH,这个服务程序是选择调色盘。显示模式 5 是 320*200 的图形模式,最多可以显示 4 种颜色,这四种颜色的意思是最多可以『同时』显示一种背景色及三种前景色,而这三种前景色有两种方式可供选择,因此事实上,在显示模式 5 有两种调色盘可供选择。就好像您去买 12 种颜色的水彩,但可在调色盘上以任意比例搭配出许多种颜色。调色盘 0 的三色是红、黄、绿;调色盘 1 的三色是青、紫红、白。背景色有 16 六种可供选择,这 16 种就是下面注1的 16 色。调用此中断时,先决定要设定背景色抑或调色盘:要设定背景色时,则使BH为 0,再使BL之数值为0到0fh之间表示注1的16色之一。要设定调色盘时,则使BH为1。再设定BL为零或一表示选择那一种调色盘。 背景色只有在前景色为 0 时才会显现出来。AH=0CH,是在绘图模式中显示一点 ( 也就是写入点像,write graphics pixel ),而 AH=0DH则是读取点像 ( read graphics pixel )。写入时,要写入位置X坐标存于CX寄存器,Y坐标存于DX寄存器,颜色存于AL寄存器。和文字模式相同,萤光幕上的Y坐标是最上面一列为零,越下面越大,X坐标则和数学的定义相同。CX、DX、AL 值之范围与显示模式有关:显示模式X坐标Y坐标颜色40~3190~1990、150~3190~1990~360~6390~1990、1AH=0DH则是读取某一位置的点像,您必须指定CX、DX,而INT 10H会传回该位置点像的颜色。AH=0EH,这个子程序是使显示器像打字机一样的显示字符来,在前面用AH=09H和 AH=0AH都可以在萤光幕上显示字符,但是这两种方式显示字符之后,光标位置并不移动,而AH=0EH则会使光标位置移动,每显示一个字符,光标会往右移一格,假如已经到最右边了,则光标会移到最左边并移到下一列,假如已经移到最下面一列的最右边,则屏幕会向上卷动。AL寄存器存储要显示的字符,BH为目前的显示页,如果是在图形模式,则BH须设为 0,假如是在图形模式下,也可以设定 BL 来表示文字的颜色,文字模式下的 BL 则无功能。AH=0FH,这个服务程序是得到目前的显示模式,调用前只需使AH设为0fh,当由INT 10H返回时,显示模式存储在AL寄存器(参考AH=00H的显示模式表),目前的显示页存于BH寄存器,总字符行数存存储在AH寄存器。注1:所谓属性是指字符的颜色、背景颜色、是否闪烁、有没有底线等性质。在彩色显示卡 (CGA/EGA/VGA等)的文字模式中,颜色是用4个位表示,故可以表现出16种颜色,如下表:二进制数颜色二进制数颜色0000黑色(black)1000灰色(gray)0001蓝色(blue)1001淡蓝色(light blue)0010绿色(green)1010淡绿色(light green)0011青色(cyan)1011淡青色(light cyan)0100红色(red)1100淡红色(light red)0101紫红色(magenta)1101淡紫红色(light magenta)0110棕色(brown)1110黄色(yellow)0111银色(light gray)1111白色(white)在彩色显示器里,如CGA、EGA、VGA等,常用一个字节(8个位)来表示文字颜色和背景颜色,通常以第0~3位表示文字本身颜色;第4~6位表示背景颜色,背景颜色只有上表左栏的8种而已;第7个位,表示是否闪烁,0表示不闪烁,1表示闪烁。但是在单色显示器里,如MDA和Hercules卡中,这些颜色表并无意义,所以属性解释方式不同,请看下表:数值属性00H空格,不显示任何数据77H显示白色方块07H正常的黑底白字70H反白的白底黑子01H加底线
汇编中断Linux 阅读全文»
 2018-09-06T23:04:33.368000    |      汇编    |     AilsonJack    |     暂无评论    |     1416 views
最近在学习80x86的汇编,在遇到中断指令:int 10,不知道这个10是什么意思,上网经过查找,这个是10是中断向量号,代表的是用于屏幕显示的中断。然后从网上整理了一张内存地址,中段向量号,中断用途的表,如下所示:内存地址(16进制)对应向量号(16进制)中断用途8088中断向量0x000 - 0x0030除以00x004 - 0x0071单步(用于debug)0x008 - 0x00B2非屏蔽中断0x00C - 0x00F3断点指令0x010 - 0x0134溢出0x014 - 0x0175打印屏幕0x018 - 0x01B6保留0x01C - 0x01F7保留8259中断向量0x020 - 0x0238定时器(IRQ0)0x024 - 0x0279键盘(IRQ1)0x028 - 0x02BA彩色/图形(IRQ2)0x02C - 0x02FB异步通信(secondary)--串行通信接口2(IRQ3)0x030 - 0x033C异步通信(primary)--串行通信接口1(IRQ4)0x034 - 0x037DLPT2控制器中断--硬磁盘(并行口)(IRQ5)0x038 - 0x03BE磁盘控制器中断--软磁盘(IRQ6)0x03C - 0x03FFLPT2控制器中断--并行打印机(IRQ7)BIOS中断0x040 - 0x04310屏幕显示I/O0x044 - 0x04711设备检验0x048 - 0x04B12测定存储器容量0x04C - 0x04F13磁盘I/O0x050 - 0x05314RS-232串行通讯口I/O0x054 - 0x05715盒式磁带I/O0x058 - 0x05B16键盘I/O0x05C - 0x05F17打印机输出0x060 - 0x06318BASIC入口代码--ROM BASIC入口代码0x064 - 0x06719引导装入程序--系统自举0x068 - 0x06B1A时钟管理提供给用户的中断0x06C - 0x06F1BCtrl + Break控制的软中断0x070 - 0x0731C定时器控制的软中断数据表指针0x074 - 0x0771D视频参数块0x078 - 0x07B1E软盘参数块0x07C - 0x07F1F图形字符扩展码DOS中断向量0x080 - 0x08320DOS中断返回0x084 - 0x08721DOS系统功能调用0x088 - 0x08B22程序中止时DOS返回地址(用户不能直接调用)0x08C - 0x08F23Ctrl+Break 处理地址(用户不能直接调用)0x090 - 0x09324严重错误处理(用户不能直接调用)0x094 - 0x09725绝对磁盘读功能0x098 - 0x09B26绝对磁盘写功能0x09C - 0x09F27终止并驻留程序0x0A0 - 0x0A328DOS安全使用0x0A4 - 0x0A729快速写字符0x0A8 - 0x0AB2AMicrosoft 网络接口0x0AC - 0x0B72B-2D未使用0x0B8 - 0x0BB2E基本SHELL程序装入0x0BC - 0x0BF2F多路服务中断0x0C0 - 0x0CB30-32未使用0x0CC - 0x0CF33鼠标中断0x0D0 - 0x0EB34-40未使用0x104 – 0x10741硬盘参数块0x108 – 0x10F42-43未使用0x110 – 0x11344PC机使用,用于指向低分辩率图形字符参数表0x114 – 0x11745保留0x118 – 0x11B46第二硬盘参数块BASIC中断向量0x11C – 0x11F47保留0x120 – 0x12348PC机使用,用于把PC机的键盘代码变换为标准的键盘代码0x124 – 0x12749指向键盘增强服务变换表0x128 – 0x17F4A-5F保留0x180 – 0x19F60-57为用户程序保留的单元0x1A0 – 0x1BF68-6F未使用0x1C0 – 0x1C370硬件中断0x1C4 – 0x1C771硬件中断90x1C8 – 0x1CB72硬件中断100x1CC – 0x1CF73硬件中断110x1D0 – 0x1D374硬件中断120x1D4 – 0x1D775硬件中断130x1D8 – 0x1DB76硬件中断140x1DC – 0x1DF77硬件中断150x1E0 – 0x1FF78-7F未使用0x200 – 0x21780-85为BASIC保留0x218 – 0x3C386-F0BASIC程序运行时提供给BASIC解释程序作用0x3C4 – 0x3FFF1-FF未使用
汇编中断Linux 阅读全文»
 2018-08-31T22:56:41.226000    |      汇编    |     AilsonJack    |     暂无评论    |     1119 views
ARM的数据处理指令大致可以分为3类:数据传送指令,运算指令,比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据传送或算术逻辑运算指令均可选择使用S后缀,以使指令影响CPSR中的标志。1、ARM指令集-基本指令格式ARM是三地址指令格式,指令的基本格式如下:<opcode>  {<cond>}  {S}  <Rd> ,<Rn>{,<operand2>}其中<>号内的项是必须的,{} 号内的项是可选的。各项的说明如下:opcode:指令助记符;cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器;Rn:第1个操作数的寄存器;operand2:第2个操作数;灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:1)、#immed_8r——常数表达式:如:ADD R0, R1, #3 ;R0 = R1 + 32)、Rm——寄存器方式:如:SUB R0, R1, R2 ;R0 = R1 – R23)、Rm,shift——寄存器移位方式:如:ADD R0, R1, R2, LSL, #3 ;R0 = R1 + R2<<32、数据传送指令ARM的数据传送指令有两条,如下所示:注:当后缀有S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。3、运算指令1)、算术运算指令注:当后缀有S时,这些指令根据结果更新标志N、Z、C、V。2)、逻辑运算指令注:当后缀有S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。4、比较指令注:这些指令直接影响N,Z,C和V标志位(不需要加后缀S)。MOV R0, #3CMN R0, #-2 ;Z=0CMN R0, #-3 ;Z=1CMN可以理解为,判断两个数是否互为相反数。
ARM编程语言汇编 阅读全文»
 2018-08-29T16:27:55.140000    |      汇编    |     AilsonJack    |     暂无评论    |     3930 views
最近在阅读《Linux内核完全注释》这本书,试图多了解Linux内核的运行过程。书中当然也涉及到汇编代码的编写。这本书的阅读笔记,应该会在后面陆续的发布,敬请期待吧。在Linux系统中,使用AT&T语法编写汇编代码时,遇到了一个问题,就是编译代码时会出现问题:"invalid instruction suffix for push"。我的编译环境:Ubuntu 14.04 x86_64,在终端中执行命令:as -o callee.o callee.s,此时就出现了错误提示:invalid instruction suffix for push,截图如下:错误原因是,在64位系统和32位系统的as命令对于某些汇编指令的处理支持不一样造成的。在文件callee.s中,包含指令:pushl  %ebp,该指令在64位系统下就编译不过。解决方法:在callee.s中,在代码头部添加.code32即可:然后再次编译该汇编文件,编译顺利通过。如果还有其他的问题,欢迎留言讨论。
编程语言汇编Linux内核 阅读全文»
 2016-04-30T19:10:36.549000    |      汇编    |     AilsonJack    |     暂无评论    |     4644 views
ARM的程序状态寄存器CPSR反映了当前处理器的状态,其中包含:1)、4个条件代码标志(负(N)、零(Z)、进位(C)和溢出(V) );2)、2个中断禁止位,分别控制一种类型的中断;3)、1个用于指示当前执行指令(ARM还是Thumb)的位;4)、5个对当前处理器模式进行编码的位。CPSR的寄存器格式如下图:1、条件代码标志在ARM状态下,绝大多数的指令都是有条件执行的;在Thumb状态下,仅有分支指令(B、BL、BX)是条件执行的。N:负数标志N=1表示运算结果为负数(符号位为1);N=0表示运算结果为正数或者0(符号位为0)。举例如下:MOVS R1, #0x3 ;N=0 ,符号位为0,表示正数MOVS R2, 0x80000000 ;N=1 ,符号位为1,表示负数SUBS R0, R1, #0x1 ;N=0 ,R0=R1-0x1SUBS R0, R1, #0x3 ;N=0 ,R0=R1-0x3SUBS R0, R1, #0x4 ;N=1 ,R0=R1-0x4Z:零标志Z=1表示运算结果为零;Z=0表示运算结果非零。举例如下,依然是上面的例子:MOVS R1, #0x3 ;N=0 Z=0 ,符号位为0,表示正数MOVS R2, 0x80000000 ;N=1 Z=0 ,符号位为1,表示负数SUBS R0, R1, #0x1 ;N=0 Z=0 ,R0=R1-0x1SUBS R0, R1, #0x3 ;N=0 Z=1 ,R0=R1-0x3SUBS R0, R1, #0x4 ;N=1 Z=0 ,R0=R1-0x4C:进位标志可以有4种方法来设置C位的值:1)、加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。举例如下:MOV R1, #0xfffffffdADDS R0, R1, #0x1 ;N=1 Z=0 C=0 ,R0=R1+0x1=0xfffffffeADDS R0, R1, #0x2 ;N=1 Z=0 C=0 ,R0=R1+0x2=0xffffffffADDS R0, R1, #0x3 ;N=0 Z=1 C=1 ,R0=R1+0x3=0x0 计算结果溢出ADDS R0, R1, #0x4 ;N=0 Z=0 C=1 ,R0=R1+0x4=0x1 计算结果溢出2)、减法运算(包括比较指令CMP):当运算时产生了借位C=0,否则C=1。举例如下,依然是上面的例子:MOVS R1, #0x3 ;N=0 Z=0 C=0,符号位为0,表示正数,没有产生进位MOVS R2, 0x80000000 ;N=1 Z=0 C=1,符号位为1,表示负数,没有产生借位SUBS R0, R1, #0x1 ;N=0 Z=0 C=1,R0=R1-0x1,没有产生借位SUBS R0, R1, #0x3 ;N=0 Z=1 C=1,R0=R1-0x3,没有产生借位SUBS R0, R1, #0x4 ;N=1 Z=0 C=0,R0=R1-0x4,产生了借位3)、对于包含移位操作的非加/减法指令,C为移出值的最后一位。举例如下:MOVS R1, 0x80000000 ;N=1 Z=0 C=1 ,符号位为1,表示负数,没有产生借位LSRS R2, R1, #1 ;N=0 Z=0 C=0 ,逻辑右移1位,移出的值为0,那么C=0,R2=0x40000000LSLS R3, R2, #2 ;N=0 Z=1 C=1 ,逻辑左移2位,移出值的最后一位为1,那么C=1,R2=0x000000004)、对于其他的非加/减法运算指令,C的值通常不变。简单总结下C值改变的情况:加法产生进位,减法没产生借位时C位置1;对于移位操作,C位为移出值的最后一位。V:溢出标志可以有2种方法设置V的值:1)、对于加/减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。2)、对于其他的非加/减运算指令,V的值通常不变。处理器内部以补码的方式表示有符号数,假设该处理器为8位的,那么表达的整数范围为:-128~+127,如果计算的结果超出了-128~+127,那么溢出标志V置位。溢出标志V和进位标志C是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围;溢出标志表示有符号数运算结果是否超出范围。举例如下:MOV R1, #0x7fffffff ;32位正数的最大值ADDS R0, R1 , #1 ;N=1 Z=0 C=0 V=1 ,R0=0x80000000ARM指令的基本格式如下:<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率(关于ARM指令更详细的说明将在下一篇文章中进行说明)。指令条件码表:2、控制位I:中断禁止位I=1表示禁止IRQ中断;I=0表示使能IRQ中断。F:中断禁止位F=1表示禁止FIQ中断;F=0表示使能FIQ中断。T:状态位T=1表示程序运行于Thumb状态;T=0表示程序运行于ARM状态。M4~M0:模式位这几位是模式位,这些位决定了处理器的运行模式,具体含义如下图:
ARM编程语言汇编 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154791 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号