汇编语言练习_0_字符串显示

文章目录

  • 环境
    • 1、Bochs虚拟机
    • 2、VirtualBox
  • 工具
    • 1、notepad++
    • 2、nasm
  • 思路
    • 第一步:
    • 第二步:
    • 第三步:
    • 第四步:
    • 第五步:
    • 第六步:
    • 第七步:
    • 第八步:
  • 解析
    • 1、第二行中jmp code
    • 2、计算字符串长度
    • 3、ds为何为0x07c0
    • 4、有关8086显存知识
    • 5、loop s解释
    • 6、结尾的字符填充
  • 效果
    • 1、virtualbox
    • 2、bochs
  • 代码
    • 1、汇编代码
    • 2、机器码 对照 汇编代码

环境

1、Bochs虚拟机

代码调试

2、VirtualBox

BIOS运行

工具

1、notepad++

编写代码

2、nasm

编译工具

思路

第一步:

定义将要输出的字符串数据

第二步:

es:di指向显存

第三步:

ds:si指向将要输出的数据

第四步:

用cx做计数器,计算字符串长度

第五步:

al做中转站,将数据填入al,si加1
因为内存之间不能直接传输数据

第六步:

将al中的数据填入显存,di加1
填入的数据需要设置属性,属性0x07,就填在数据后面,di加1

第七步:

执行到loop s,cx自动减1,若cx不等于0,则cs:ip跳转至s,否则按照顺序执行

第八步:

循环完毕,跳转至code,使得cpu一直在code代码段循环
因为后面就没有代码了,于是让它一直循环

解析

1、第二行中jmp code

是为了跳过数据段,执行代码

2、计算字符串长度

标号data与标号code表示偏移,它们之间只有字符串,所以相减能够得到字符串长度

3、ds为何为0x07c0

因为BIOS程序会被加载到0x0000 : 0x7c00,所以该程序的起始段地址就是0x07c0

4、有关8086显存知识

链接

5、loop s解释

loop与cx配合能够起到for循环的效果
当cx不为零,程序跳转至s执行
当cx为零时,则按照顺序执行

6、结尾的字符填充

我写的是BIOS程序,计算机对BIOS程序的要求就是512字节,且以0x55,0xAA结尾

效果

1、virtualbox

汇编语言练习_0_字符串显示_第1张图片

2、bochs

汇编语言练习_0_字符串显示_第2张图片

代码

1、汇编代码

start:
	jmp code

data:
	;也可使用ASCII码
	db 'Hello Taudre11, this is the operating system I wrote, by the way, do not forget to memorize words early'


code:
	;es指向显存,di做指针
	mov ax,0xB800
	mov es,ax
	mov di,0x0
	
	;ds指向待写入数据,si做指针
	mov ax,0x07c0
	mov ds,ax
	mov ax,data
	mov si,ax
	
	;循环计数器
	mov cx,code-data

s:
	;写显存
	;al做中转站
	mov al,[ds:si]
	inc si
	
	mov byte [es:di],al
	inc di
	mov byte [es:di],0x07
	inc di
	loop s
	
	jmp code                 ;循环该代码段

current:
	;字符填充
	times 510-(current-start) db 0
	db 0x55,0xAA       ;BIOS要求:0x55,0xAA结尾

2、机器码 对照 汇编代码

     1                                  start:
     2 00000000 EB67                    	jmp code
     3                                  
     4                                  data:
     5                                  	;也可使用ASCII码
     6 00000002 48656C6C6F20546175-     	db 'Hello Taudre11, this is the operating system I wrote, by the way, do not forget to memorize words early'
     6 0000000B 64726531312C207468-
     6 00000014 697320697320746865-
     6 0000001D 206F7065726174696E-
     6 00000026 672073797374656D20-
     6 0000002F 492077726F74652C20-
     6 00000038 627920746865207761-
     6 00000041 792C20646F206E6F74-
     6 0000004A 20666F726765742074-
     6 00000053 6F206D656D6F72697A-
     6 0000005C 6520776F7264732065-
     6 00000065 61726C79           
     7                                  
     8                                  
     9                                  code:
    10                                  	;es指向显存,di做指针
    11 00000069 B800B8                  	mov ax,0xB800
    12 0000006C 8EC0                    	mov es,ax
    13 0000006E BF0000                  	mov di,0x0
    14                                  	
    15                                  	;ds指向待写入数据,si做指针
    16 00000071 B8C007                  	mov ax,0x07c0
    17 00000074 8ED8                    	mov ds,ax
    18 00000076 B8[0200]                	mov ax,data
    19 00000079 89C6                    	mov si,ax
    20                                  	
    21                                  	;循环计数器
    22 0000007B B96700                  	mov cx,code-data
    23                                  
    24                                  s:
    25                                  	;写显存
    26                                  	;al做中转站
    27 0000007E 3E8A04                  	mov al,[ds:si]
    28 00000081 46                      	inc si
    29                                  	
    30 00000082 268805                  	mov byte [es:di],al
    31 00000085 47                      	inc di
    32 00000086 26C60507                	mov byte [es:di],0x07
    33 0000008A 47                      	inc di
    34 0000008B E2F1                    	loop s
    35                                  	
    36 0000008D EBDA                    	jmp code                 ;循环该代码段
    37                                  
    38                                  current:
    39                                  	;字符填充
    40 0000008F 00            	times 510-(current-start) db 0
    41 000001FE 55AA                    	db 0x55,0xAA       ;BIOS要求:0x55,0xAA结尾

你可能感兴趣的:(OS编写,8086,汇编)