7-第一个汇编程序hello world

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35733751/article/details/85013453

经过前面的一段学习,现在终于进入到实战阶段了,这是我们要写的第一个汇编程序,在屏幕上显示hello world字符。

访问显存和访问内存一样,需要用到逻辑地址,即“段地址:偏移地址”的形式。我们知道文本模式下起始物理地址为0xB8000(即显存的起始地址),因此我们可以把0xB8000看成是段地址0xB800,偏移地址为0x0000到0xFFFF区域。

 

注意,这里我们使用ES寄存器指向显存所在段,格式如下:

mov ax,0xB800
mov es,ax 

例如,下面这种格式是错误的:

mov es,0xB800	;8086CPU不允许这种格式

接下来就是如何用汇编程序显示字符了,为了方便,大多数汇编语言允许用字符来代替ASCII码表的数值,例如:

mov byte [es:0x0000],0x49   ;大写字母I的ASCII码值

我们直接使用字符”I”代替ASCII码值

mov byte [es:0x0000],'I'

字符I用单引号括起来,这样程序在编译阶段,汇编语言编译器会将字符I替换成ASCII码值。

完整的汇编代码如下:

;
;以下代码的功能为在屏幕上输出:hello world
;


;初始化段寄存器ES,
mov ax,0xB800
mov es,ax 

;
mov byte [es:0x0000],'h'
;0x07表示显示为黑底白字,无闪烁,无亮
mov byte [es:0x0001],0x07   

mov byte [es:0x0002],'e'
mov byte [es:0x0003],0x07 

mov byte [es:0x0004],'l'
mov byte [es:0x0005],0x07 

mov byte [es:0x0006],'l'
mov byte [es:0x0007],0x07 

mov byte [es:0x0008],'o'
mov byte [es:0x0009],0x07 

mov byte [es:0x000A],' '
mov byte [es:0x000B],0x07 

mov byte [es:0x000C],'w'
mov byte [es:0x000D],0x07 

mov byte [es:0x000E],'o'
mov byte [es:0x000F],0x07 

mov byte [es:0x0010],'r'
mov byte [es:0x0011],0x07 

mov byte [es:0x0012],'l'
mov byte [es:0x0013],0x07 

mov byte [es:0x0014],'d'
mov byte [es:0x0015],0x07 

;填充数据
times 510-($-$$) db 0x00

;在最后的位置写入标志
db 0x55,0xAA  

然后按下Ctrl + 1进行编译,再按Ctrl + 2写入主引导扇区(即0扇区)

然后再点击调试,如下图所示:

我们可以看到在显存的0xB800起始地址中,存储的都是hello world字符的数据是ASCII码值,也就是说汇编程序在编译时把字符都转换成对应的ASCII码值了,因为计算机是不认识字符的,它只字符对应的ASCII码值。

 

以上是我在看《x86汇编语言:从实模式到保护模式》做的一些笔记,希望能对正在学习x8086的同学有所帮助,对于想要深入学习x86汇编语言的同学,我的建议是可以看书学习。

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/85013453
今日推荐