跳至主要內容

ComputerSystems

LincZero大约 2 分钟

ComputerSystems

目录

数组

字符串

如何更优雅的打印字符串

需求:给定一段字符串,打印出来

方法:

数据源:ds (数据段寄存器) + si (源索引寄存器),每取出一个字符si就+1 输出:es (扩展段寄存器) + di (目标索引寄存器),其中es保存显存的地址 = 0xb800,每写入一个自负di就+1 通过循环依次取字符和输出字符 中续:BL待写入,BH字符属性

section code align=16 vstart=0x7c00

mov si, SayHello	; 将字符串放在源索引寄存器(si而已16位,这里只是放个地址,SayHello是地址)
xor di, di			; 将di置为0
call PrintString	; 调用函数
mov si, SayByeBye	; 将字符串放在源索引寄存器
call PrintString	; 调用函数
jmp End

PrintString:		; 函数
	.setup:			; 标志位
	mov ax, 0xb800	; 显卡内存,要输出的位置
	mov es, ax		; 扩展段寄存器
	
	mov bh, 0x07	; 设置字符属性
	mov cx, 0xffff	; 字符串长度(循环次数)
	
	.printchar:			; 循环体
        mov bl, [ds:si]	; 取第一个字符到bl寄存器,并移动指针
        inc si			; -
        mov [es:di], bl	; 写入到显存,并移动指针
        inc di			; -
        mov [es:di], bh	; -
        inc di			; -
        or bl, 0x00		; 判断是否循环结束
        jz .return		; 若是则跳出循环
	loop .printchar
	
	.return:		; 标志位
ret					; 函数结束

SayHello db 'Hi there,I am Codeing Master!'		; 相当于以0x00结尾的变量
		db 0x00
SayByeBye db 'I think you can handle it, bye!'	; 相当于以0x00结尾的变量
		db 0x00
	
End: jmp End
times 510-($-$$) db 0
	db 0x55, 0xaa
	
; 输出:Hi there,I am Codeing Master!I think you can handle it, bye!

程序里比较多的Magic Number,即魔法数

equ改良代码:

NUL equ 0x00			; 空
SETCHAR equ 0x07		; 设置字符属性
VIDEOMEM equ 0xb800		; 显卡内存
STRINGLEN equ 0xffff	; 字符串长度(循环次数)

section code align=16 vstart=0x7c00

mov si, SayHello	; 将字符串放在源索引寄存器(si而已16位,这里只是放个地址,SayHello是地址)
xor di, di			; 将di置为0
call PrintString	; 调用函数
mov si, SayByeBye	; 将字符串放在源索引寄存器
call PrintString	; 调用函数
jmp End

PrintString:		; 函数
	.setup:			; 标志位
	mov ax, VIDEOMEM; 显卡内存,要输出的位置
	mov es, ax		; 扩展段寄存器
	
	mov bh, SETCHAR	; 设置字符属性
	mov cx, STRINGLEN; 字符串长度(循环次数)
	
	.printchar:			; 循环体
        mov bl, [ds:si]	; 取第一个字符到bl寄存器,并移动指针
        inc si			; -
        mov [es:di], bl	; 写入到显存,并移动指针
        inc di			; -
        mov [es:di], bh	; -
        inc di			; -
        or bl, NUL		; 判断是否循环结束
        jz .return		; 若是则跳出循环
	loop .printchar
	
	.return:		; 标志位
ret					; 函数结束

SayHello db 'Hi there,I am Codeing Master!'		; 相当于以0x00结尾的变量
		db NUL
SayByeBye db 'I think you can handle it, bye!'	; 相当于以0x00结尾的变量
		db NUL
	
End: jmp End
times 510-($-$$) db 0
	db 0x55, 0xaa
	
; 输出:Hi there,I am Codeing Master!I think you can handle it, bye!