c汇编语言程序框架培训,[010][x86汇编语言]学习用户程序的编写(c08.asm)

源程序来源

加载程序

c08_mbr.asm

用户源程序:增加注释

;

;文件名:c08-2.asm

;文件说明:用户程序

;创建日期:13:08 2018/5/23

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

SECTION header vstart=0 ;定义用户程序头部段

program_length dd program_end ;程序总长度[0x00]

;用户程序入口点

code_entry dw start ;偏移地址[0x04] 此处的start来源于自己的命名

dd section.code_1.start ;段地址[0x06] 此处.start是汇编指令的语法

realloc_tbl_len dw (header_end - code_1_segment)/4

;段重定位表项个数[0x0a]

;1个表项占4个字节

;段重定位表项

code_1_segment dd section.code_1.start ;[0x0c]

code_2_segment dd section.code_2.start ;[0x10]

data_1_segment dd section.data_1.start ;[0x14]

data_2_segment dd section.data_2.start ;[0x18]

stack_segment dd section.stack.start ;[0x1c]

header_end:

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

SECTION code_1 align=16 vstart=0 ;定义代码段1(16字节对齐)

put_string: ;显示串(字符串以0结尾)

mov cl,[bx] ;取一个字符

or cl,cl ;cl=0?

jz .exit ;cl=0时返回主程序

call put_char

inc bx ;下一个字符

jmp put_string

.exit:

ret

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

put_char: ;显示一个字符

push ax

push bx

push cx

push dx

push ds

push es

;以下取当前光标:光标位置是一个16位的数值

mov dx,0x3d4 ;索引寄存器端口号 0x3d4

mov al,0x0e ;索引值14

out dx,al

mov dx,0x3d5 ;数据端口0x3d5

in al,dx ;高8位

mov ah,al

mov dx,0x3d4

mov al,0x0f

out dx,al

mov dx,0x3d5

in al,dx ;低8位

mov bx,ax ;BX 存放代表光标位置的16位数

cmp cl,0x0d ;回车符?

jnz .put_0a ;不是回车,看看是不是换行等字符?

mov ax,bx

mov bl,80

div bl

mul bl

mov bx,ax

jmp .set_cursor

.put_0a:

cmp cl,0x0a ;换行符?

jnz .put_other ;不是换行符,则正常显示字符

add bx,80

jmp .roll_screen

.put_other:

mov ax,0xb800

mov es,ax

shl bx,1 ;左移1位相当于乘以2

mov [es:bx],cl ;于光标处显示字符

;以下将光标位置推进一个字符

shr bx,1 ;右移相当于除以2,换回来bx

add bx,1 ;推进光标位置

.roll_screen: ;VGA文本模式,每行80个字符,25行

cmp bx,2000 ;光标超出屏幕?滚屏

jl .set_cursor

mov ax,0xb800

mov ds,ax

mov es,ax

cld

mov si,0xa0 ;从屏幕第2行第0列开始向上复制一行

mov di,0x00

mov cx,1920 ;80*25-80=1920

rep movsw ;以字为单位进行复制

mov bx,3840 ;4000 - 160 = 3840 清楚屏幕最底一行

mov cx,80 ;

.cls:

mov word [es:bx],0x0720 ;黑底白字的空格

add bx,2

loop .cls

mov bx,1920 ;光标位置是最后一行行首

;设置光标

.set_cursor: ;不同的情况已用不同的方法将光标的新位置计算好

mov dx,0x3d4

mov al,0x0e ;高8位

out dx,al

mov dx,0x3d5

mov al,bh

out dx,al

mov dx,0x3d4

mov al,0x0f ;低8位

out dx,al

mov dx,0x3d5

mov al,bl

out dx,al

pop es

pop ds

pop dx

pop cx

pop bx

pop ax

ret

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

start:

;初始化执行时,DS和ES指向用户程序头部段

mov ax,[stack_segment] ;设置到用户程序到自己的堆栈

mov ss,ax

mov sp,stack_end ;stack段里保留保留256字节的空间 mov sp,256

mov ax,[data_1_segment] ;设置到用户程序自己的数据段

mov ds,ax

mov bx,msg0 ;显示第一段信息

call put_string ;put_string用[bx]取每一个字符

push word [es:code_2_segment] ;段寄存器DS切换到数据段2

mov ax,begin

push ax

retf ;转移到代码段2执行

continue:

mov ax,[es:data_2_segment] ;段寄存器DS切换到数据段2

mov ds,ax

mov bx,msg1

call put_string ;显示第二段信息

jmp $

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

SECTION code_2 align=16 vstart=0 ;定义代码段2(16字节对齐)

begin:

push word [es:code_1_segment]

mov ax,continue

push ax

retf ;转移到代码段1接着执行

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

SECTION data_1 align=16 vstart=0

msg0 db ' This is NASM - the famous Netwide Assembler. '

db 'Back at SourceForge and in intensive development! '

db 'Get the current versions from http://www.nasm.us/.'

db 0x0d,0x0a,0x0d,0x0a

db ' Example code for calculate 1+2+...+1000:',0x0d,0x0a,0x0d,0x0a

db ' xor dx,dx',0x0d,0x0a

db ' xor ax,ax',0x0d,0x0a

db ' xor cx,cx',0x0d,0x0a

db ' @@:',0x0d,0x0a

db ' inc cx',0x0d,0x0a

db ' add ax,cx',0x0d,0x0a

db ' adc dx,0',0x0d,0x0a

db ' inc cx',0x0d,0x0a

db ' cmp cx,1000',0x0d,0x0a

db ' jle @@',0x0d,0x0a

db ' ... ...(Some other codes)',0x0d,0x0a,0x0d,0x0a

db 0

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

SECTION data_2 align=16 vstart=0

msg1 db ' The above contents is written by LeeChung. '

db '2011-05-06'

db 0

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

SECTION stack align=16 vstart=0

resb 256

stack_end:

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

SECTION trail align=16

program_end: ;trail段没有vstart标记,program_end是针对用户程序开头的偏移量

代码说明

循环与子程序的调用关系

循环

put_string

参数

DS 段寄存器器指向数据段

BX 指向字符串的标号所在(位于数据段内,vstart=0 规定是相对数据段开头的偏移量)

-----------------------------------------------------------

-----------------------------------------------------------

子程序

put_char

功能

显示一个字符(注意是一个)

参数

cl 要显示的字符

过程

见下方put_char流程图

-----------------------------------------------------------

-----------------------------------------------------------

光标位置的计算与光标的显示分开的,由不同的情况计算出不同的位置数值,再统一由 子程序.setcursor 进行显示。

4177e9ff49d6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

图8-19 过程put_char的流程图.png

《x86汇编语言:从实模式到保护模式》 第143页

光标的读与写

指定索引寄存器 端口号是 0x3d4

光标位置是16位数,索引值 14(0x0e)和 15(0x0f)提供光标位置的高8位、低8位

指定好寄存器之后,通过数据端口 0x3d5 进行读写

取光标位置,取到的位置16位数值放到 BX里面

===================================================

;以下取当前光标:光标位置是一个16位的数值

mov dx,0x3d4 ;索引寄存器端口号 0x3d4

mov al,0x0e ;索引值14

out dx,al

mov dx,0x3d5 ;数据端口0x3d5

in al,dx ;高8位

mov ah,al

mov dx,0x3d4

mov al,0x0f

out dx,al

mov dx,0x3d5

in al,dx ;低8位

mov bx,ax ;BX 存放代表光标位置的16位数

---------------------------------------------------------------------------------------------

写光标位置,根据不同情况计算好的光标位置通过端口写

===============================================================

;设置光标

.set_cursor: ;不同的情况已用不同的方法将光标的新位置计算好

mov dx,0x3d4

mov al,0x0e ;高8位

out dx,al

mov dx,0x3d5

mov al,bh

out dx,al

mov dx,0x3d4

mov al,0x0f ;低8位

out dx,al

mov dx,0x3d5

mov al,bl

out dx,al

-------------------------------------------------------------------------------------------------------------------

显存、光标、字符

VGA 文本模式 一页有25行,每行有80个字符

指定 es = 0xb800 di= 0x0000

假设要在第0行第0列,显示一个字符‘a’

1、需要在偶数地址写字符

mov es:[di],'a'

2、在奇数地址写颜色属性,黑底白字0x07

mov es:[di+1],0x07

因此可以看到一页能显示 80*25=2000个字符,

但同时也是存了4000个字节的数据

(一半是字符的ASCII码,一半是每个字符的对应属性)

光标的位置是一个16位的数值,

因此,对光标而言,

0表示第0行0列,

1表示第0行1列,

....

20表示第0行20列,

每一行有80列,

79表示第0行79列,

80表示第1行第0行(换行...)

....

==========================================

在子程序

.put_other:

mov ax,0xb800

mov es,ax

shl bx,1 ;左移1位相当于乘以2

mov [es:bx],cl ;于光标处显示字符

;以下将光标位置推进一个字符

shr bx,1 ;右移相当于除以2,换回来bx

add bx,1 ;推进光标位置

是通过 光标的位置数值 来确定 字符的显示位置的,

光标在哪里闪烁,字符就写到那里,

【光标位置数值 x 2 = 字符要被送入的那个偶地址】

字符的颜色属性默认是0x07不需要修改。

SECTION关键词

在用户程序中使用SECTION关键词人为的分了很多段,然后把这些段集中放到头部段header,并且借由加载器的回写在执行时变成了都是可以映射到真实物理地址的段地址,需要用到哪个段就去头部段里取,这样少得可怜的段寄存器就够用了,如果全局固定es指向头部段,那么就疯狂复用ds寄存器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件共享服务器搭建

详细需求描述1、网络拓扑图如下:2、利用虚拟机实现网络拓扑,要求如下(1)虚拟机环境使用hostonly(2)服务器要求:安装Widnwos Server 2008 R2操作系统内存要求:750MB安装五块物理SCSI磁…

当c语言老师遇到网络崩溃,网络教学搞不定?工科教授来支招!

新学期已经到来但是由于新冠病毒肆虐我们不得不在“线上会面”网络远程教学颠覆了传统课堂模式的同时,也为教员们的教学工作带来极大的挑战。想想看,面对一个计算机屏幕滔滔不绝地讲上90分钟,确实需要大量的准备工作。网课平台怎么选&#xf…

在JS函数中执行C#中的函数、字段

1、调用字段 cs文件的代码&#xff1a; public int id 0;protected void Page_Load(object sender, EventArgs e){id 2;} View Codejs页面的代码&#xff1a; function CheckFunc() {alert("<% id%>");} View Code2、调用函数&#xff1a; 在JS函数中访问或执…

计算本年 本月 本周的起始日期

html: <table><tr><td align"right" width"120px"> 销售时间区间:</td><td><select id"ddlChoiceDate" name"ddlChoiceDate" runat"server" onchange"SelectChange(this.value);&quo…

Android查看真机布局,android-外部存储

外部存储&#xff0c;个人理解是在app作用域之外存储&#xff0c;就是数据没有和app做关联&#xff0c;app卸载后&#xff0c;它依旧存在而不再是之前手机本身存储空间和sd卡的区别&#xff0c;现在安卓手机已经不携带可拆卸的SD卡androidManifest.xml 需要写入读写权限简单布局…

android国籍组件,android组件化之路

问题&#xff1a;实际业务变化快&#xff0c;而工程内各个功能模块耦合度太高&#xff0c;不能对功能模块进行快速方便地拆分或组装。团队共同开发中&#xff0c;可能一个文件同时被多人修改&#xff0c;导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改&#xff…

UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数...

lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它。 在文档“进程控制三部曲”中,我们讲的第三部曲是使用 wait 函…

android代码导入有错误,android新项目导入后进行编译出现cmake错误

问题描述使用as加载并且gradle sync 提示&#xff1a;SIMPLE:error configure同时使用make project提示问题出现的环境背景及自己尝试过哪些方法已经尝试更换过ndk 调整target brinary 然后完全clean project等操作相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)使用g…

BZOJ1652 [Usaco2006 Feb]Treats for the Cows

蒟蒻许久没做题了&#xff0c;然后连动规方程都写不出了。 参照iwtwiioi大神&#xff0c;这样表示区间貌似更方便。 令f[i, j]表示i到j还没卖出去&#xff0c;则 f[i, j] max(f[i 1, j] v[i] * T, f[i, j - 1] v[j] * T) &#xff08;←这样用推的方式更好想一点。。&#…

git+jekyll部署备忘

github&#xff0c;会自动帮忙编译jekyll编写的文件&#xff0c;只要将文件放到gh-pages分支 (或者使用官方教程的二级域名方式&#xff0c;项目名字&#xff0c;可以随便起&#xff0c;官网的例子是 用户名.github.com 作为项目名字&#xff0c;可以使用 用户名.github.com …

搜索 由浅入深 之一 水题

搜索很重要&#xff0c;是很难学的算法&#xff0c;能看懂很简单&#xff0c;但是要想真正做出题来就比较困难了&#xff0c;那么&#xff0c;我们现在就水题开始研究搜索。 水题之&#xff1a; 1024: [SCOI2009]生日快乐 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 830 …

android studio创建文件,如何在Android Studio中创建File Templates

标签&#xff1a; File Template Android Studio我发现一个可以让写程序变得简单的方法&#xff0c;那就是自定义文件模板(Custom File Templates).那么什么是File Templates呢&#xff1f;说白了&#xff0c;就是一个已经包含一部分代码的源文件如何创建File Templates首先&am…

odoo 中多币种处理(外币处理)

2019独角兽企业重金招聘Python工程师标准>>> 1. odoo多币种处理 http://www.cnblogs.com/godzone/archive/2012/11/05/2754436.html 2. OpenERP的价格表&#xff08;Pricelist&#xff09;机制: http://www.chinamaker.net/html/2011/study_1123/78.html 3. odoo …

h5 android数字键盘,【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)...

在Vue中的项目&#xff0c;基于VUX-UI开发&#xff0c;一个常见的需求&#xff1a;1、金额输入框2、弹出数字键盘3、仅支持输入两位小数&#xff0c;限制最大11位数&#xff0c;不允许0开头第一&#xff0c;首先想到额就是在VUX-UI中制定typenumber。--不可行VUX中的文档和代码…

Sybase数据库应用系统调优的五大领域

Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源&#xff1a;慧聪it网本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例&#xff0c;涉及了数据库应用系统调优的五大领域&#xff1a;压力测试、 应用端调优、服务器端…

android 6.0 ios9谁快,没安卓6.0流畅?iOS 9突飞猛进终于不卡

今天早些时候&#xff0c;iOS 9.1正式发布&#xff0c;改进系统Bug&#xff0c;添加新功能等&#xff0c;但还有不少反应系统流畅了。不知道是否是心里作用的关系&#xff0c;之前不少果粉吐槽iOS 9过于卡顿&#xff0c;苹果也是在一个版本一个版本的改进&#xff0c;这次的iOS…

(UML两个汇总)九种图。

最后总结UML关系&#xff0c;有明确的关系&#xff0c;现在让我们总结一下UML九图。。图往往比文字要直观&#xff0c;因此&#xff0c;当我们开发软件。文件必须是不可或缺的人物&#xff0c;。以下我将这九种图分了一下&#xff1a; 我们还能够将这九种图分为静态图和动态图&…

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是&#xff0c;数据源不限于 SQL Server&#xff1b;可以使用任何数据源&#xff0c;只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式&#xff1a;下面的代码使用到了Co…

Android Ac 控件,Android控件--MultiAutoCompleteTextView

1.功能可支持选择多个值(在多次输入的情况下)&#xff0c;分别用分隔符分开&#xff0c;并且在每个选中的时候再次输入值时会自动匹配&#xff0c;可用在发短信、发邮件时选择联系人这种类型当中。2.独特属性android:completionThreshold"3" ----设置输入多少字符时自…

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论。。。我去 Orz hzwer&#xff0c;这道题其实是可以转化成Nim游戏的&#xff01; "第一步&#xff1a; 先从n根巧克力棒中取出m(m>0)根&#xff0c;使得这m根巧克力棒的xor和为0&#xff0c;同时使得剩下的n-m根巧克力棒无论怎么取&#xff0c;xor和都不…