第1章 打印启动信息

显示器I/O知识:

显存地址是 0xb8000,屏幕是80*25,每个位置由两个字节决定。第一个字节决定所显示的字符,如0xb8000。第二个字节决定怎么显示字符(背景颜色,前景颜色),如0xb8001。


汇编命令知识

cld: 方向标志置0,si和di 增1或增2;

std: 方向标志置1,si和di 减1或减2


串传送指令(数据从A内存到B内存)

cld
movsb   # ds:[si] -> es:[di], ++si, ++di 
movsw   # ds:[si] -> es:[di], si+=2, di+=2

串存储指令(数据从寄存器到内存)

cld
stosb  # al -> es:[di], ++si
stosw  # ax ->es:[di], si+=2

串读取指令(数据从内存到寄存器)

cld
lodsb # ds:[si] –> al, ++si
lodsw # ds:[si] –> ax, si+=2

重复前缀指令

rep: 用在movs、stos、lods指令前,每执行一次指令,cx减1;直到cx = 0,重复执行结束。


下面这段代码的作用是把内存中的字符串复制到0xb8000地址上

   
    .text
    .global start
    .code16
start:
    jmp $0x0, $code
msg:
    .string "1kos booting......\x0"
code:
    movw    $0xb800,%ax        #显存地址在0xb8000
    movw    %ax,    %es        
    xorw    %di,    %di        #es:di = 0xb8000
    xorw    %ax,    %ax
    movw    %ax,    %ds        #ds:si = msg
    movw    $msg,   %si
    cld                #si和di自增
    movb    $0x07,  %ah        #字符属性:黑底白字

loop:
    cmp        $0x0,   (%si)
    je        end
    lodsb            #ds:[si] -> al, ++si
    stosw            #ax -> es:[di], di += 2  #al=字符 ah=属性
    jmp        loop

end:
    jmp        end
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值