ComputerSystems
大约 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!