汇编|使用10h中断来显示字符串

特么这个问题困扰了我好久,毕竟是个OS newbie,还没有汇编的基础。

在前天的加载loader的实验中,老师要求显示字符串,但是给的代码只是显示一个字符。

愚蠢的我实在没办法,最后为了按期完成实验,只能一个个字符地输出,呀真是羞耻。

好了,趁着清明假期,花了几个小时终于弄懂了。

下面进入正题!

前戏是先对boot.asm和loader.asm编译:

nasm -o boot.bin boot.asm
nasm -o loader.bin loader.asm

然后把boot.bin写入软盘a.img:

dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

然后三连击,把挂载软盘:

最后一个参数是你floppy文件夹的路径,自己随便去创建一个就好,不一定用/mnt里面的

sudo mount -o loop a.img /home/jennings/exp2/floppy/
sudo cp loader.bin /home/jennings/exp2/floppy/ -v
sudo umount /home/jennings/exp2/floppy/

重点来了(敲黑板),

以下是loader.asm的代码:

org 0100h ; 告诉编译器程序加载到 0100h处

mov ax, cs 

mov ds, ax

mov es, ax

call DispStr ; 调用显示字符串例程

jmp $ ; 无限循环

DispStr:

mov ax, LoaderMessage

mov bp, ax ; es:bp = 串地址

mov cx, 31 ; cx = 串长度

mov ax, 01301h ; ah = 13, al = 01h

mov bx, 000ch ; 页号为 0(bh = 0) 黑底红字(bl = 0Ch,高亮)

mov dh, 0;显示的行号

mov dl, 39;显示的列号

int 10h ; 10h 号中断

ret

LoaderMessage: db "This is Zhengjianning‘s loader."

解释程序:

最上面的3个mov语句是让ds,es,cs指向同一个位置,之后调用显示字符串的函数,然后程序无限循环。

这段程序是利用BIOS提供的int 10h中断服务来对屏幕进行绘制

mov  bp, ax的作用就是把字符串的地址放到es:bp处(汇编基础不好,暂时不是很懂这里)

cx是设置字符串的长度,自己数自己的字符串多长然后相应修改

ah是设定服务模式,13h的意思是显示字符串al设置光标位置,01h的意思是光标跟随字符串。具体请参见:http://blog.csdn.net/hua19880705/article/details/8125706,这里写得特别详细,感谢作者!

bx用来设置字符串的属性,颜色啊,闪烁啊,背景啊等等。。。

dh是显示字符串的行号(0~24),dl是显示字符串的列号(0~79)

结果截图:

好激动。。。接下来加载内核的实验要显示字符串不用愚蠢地一个个字符输出了。。。/尴尬

参考文章:

http://blog.csdn.net/rockursoul/article/details/3507282

http://blog.csdn.net/hua19880705/article/details/8125706

感谢上面两位作者的贡献!

时间: 2024-10-26 18:32:13

汇编|使用10h中断来显示字符串的相关文章

x8086汇编在显存中显示字符串

题目:在屏幕中间显示绿色,绿底红色,白底蓝色的字符串‘welcome to masm!’ 80X25彩色字符模式显示缓冲区的结构: 在内存地址结构中,B8000H~BFFFFH共32KB的空间,为80x25彩色字符模式的显示缓冲区.向这个地址空间写入数据,写入的内容将立即出现在 显示器上. 在80x25彩色模式下,显示器可以显示25行,每行80个字符,每个字符可以由256中属性. 80x25模式下,一屏的内容在显示缓冲区共4000个字符. ============================

使用BIOS中断显示字符串笔记(int 10h 13号中断)

BIOS的10H中断的13号中断用于显示字符串,参数为: 1.AH=13H 2.AL=显示方式 如果AL=0,表示目标字符串仅仅包含字符,属性在BL中包含,不移动光标 如果AL=1,表示目标字符串仅仅包含字符,属性在BL中包含,移动光标 如果AL=2,表示目标字符串包含字符和属性,不移动光标 如果AL=3,表示目标字符串包含字符和属性,移动光标 总之,可以归纳为: |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| AL BIT0为0表示不移动光标,为1表示移动光

显示字符串

字符串中断 通过AH=13H中断来显示字符串. BIOS中断定义如下 入口参数: AH=13H //在Teletype模式下显示字符串 BH=页码 BL=属性.背景色和文字颜色(若AL=00H或01H) CX=显示字符串长度 (DH.DL)=坐标(行.列) ES:BP=显示字符串的地址 AL=显示输出方式 0--字符串中只含显示字符,其显示属性在BL中.显示后,光标位置不变 1--字符串中只含显示字符,其显示属性在BL中.显示后,光标位置改变 2--字符串中含显示字符和显示属性.显示后,光标位置

汇编中的10H中断int 10h详细说明

汇编中的10H中断是由BIOS对显示器和屏幕所提供的服务程序.使用int 10h服务程序时,必须先指定ah寄存器为以下显示服务编号之一,以指定需要调用的功用.显示服务 (Video Service:int 10h) 00H:设置显示器模式 01H:设置光标形状 02H:设置光标位置 03H:读取光标信息 04H:读取光笔位置 05H:设置显示页 06H.07H:初始化或滚屏 08H:读光标处的字符及其 属性 09H:在光标处按指定属性显示字符 0AH:在当前光标处显示字符 0BH:设置调色板.背

汇编在dos下显示字符串的子程序

assume cs:code,ss:stack,ds:data data segment db 'welcome to masm','0' data ends stack segment dw 8 dup (0) stack ends code segment start: mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 mov ss,stack call show_str mov ax,4c00h int 21h show_s

汇编 DOS的中断调用 INT 21H

DOS系统功能调用 这个汇编指令是用于提供DOS系统功能调用. 它是由DOS提供的一组实现特殊功能的子程序供程序猿在编写自己的程序时调用,以减轻编程的工作量. 分两种,re=view">DOS系统功能调用和BIOS中断调用. 链接里都是一些经常使用的内容,大家能够自己去百度,一定比我这里给出的全面非常多,有那种DOS系统功能调用表. 调用步骤大致 (1)系统功能号送到寄存器AH中. (2)入口參数送到指定的寄存器中: (3)用INT 21H指令运行功能调用: (4)依据出口參数分析功能调用

汇编高手带你玩转字符串,快上车!

字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s="a1a2···an"(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字).String类型你一定不陌生,毕竟每一位coder都是从var str1 = "Hello World"过来的.但它真的就只是如此吗?听我娓娓道来.一.思考在 Swift 开发使用字符串的过程中,你

STM32 液晶屏 显示字符串 中遇到的一个问题

用STM32控制液晶屏显示电流.电压参数. 我希望的结果是这样的: 可是,实际写出来的效果是这样的. 可以看出,电流参数那一行后面多出了几个字符"Volta",刚好是要下一行需要显示内容的前面一部分. 试着把电流参数值得位数改短一些,比如把前面的20.54改为2.54.显示出来就是正常的.由此想到这个问题的产生可能和要显示的字符串的长度有关.所以就把跟电流显示的相关的代码都看了看,从定义到调用液晶模块的API. char Current_display[15];// 定义一个与电流参数

显示字符串的全排列

显示字符串的全排列: 1 public static void AllSequenceofString(String string){ 2 if(string == null) 3 return; 4 char[] chars = string.toCharArray(); 5 Permutation(chars,0); 6 } 7 private static void Permutation(char[] chars, int index) { 8 // TODO Auto-generate