• 超级搬运工


    前我们往屏幕输出了一个Hello,费了老大的劲。
    有没有什么更简单的方法呢?
    当然有啦。

    我们把所有的文字对应的Ascll码统一放到一块内存里面。
    再把这些东西统一搬进去显存里面。





    mov cx,10
    ES:B800
    DI:0

    DS:07C0
    SI:8


    rep movsb byte ptr [ES:DI],byte ptr [DS:SI]

    超级搬运工:
    1.要搬的东西的在哪里。
    2.把东西搬到哪里去。
    3.每一次可以搬多少东西,需要搬多少次。
    4.从上往下搬,还是从下往上搬。


    movsb 

     32位  16位 8位寄存器
     EAX  AX AH AL
     ECX  CX CH CL
     EDX  DX DH DL
     EBX  BX BH BL
     ESP  SP  
     EBP  BP  
     ESI  SI  
     EDI  DI  




    DF=方向标志位(Direction Flag)
    决定串处理指令控制每次操作后si、di的增减。
    df=0,则每次操作后si、di递增,否则递减。


    cld指令会把DF=0
    std指令会把DF=1




    repeat



    在8086种,有这样的功能指令叫做
    movsb和movsw
    move string

    这两个指令的作用是,把一块内存的东西搬到另外一块内存里面。

    那么它如何使用呢?

    movsb=是以字节进行复制
    movsw=是以两个字节(字)进行复制

    movsb byte ptr [ES:DI],byte ptr [DS:SI]


    从哪里开始搬东西呢?需要一个地址DS:SI
    把东西搬到哪里呢? ES:DI

    搬几次呢?  把要搬的次数放到 cx里面。 
    每搬1次,就把cx里面的数字减1,减到0就代表搬完了。

    mov ax,0x07c0  ;3 07c00
    mov ds,ax ;2

    jmp near mycode  ;3


    mydata:;07c08
    db 'H',0x7,'e',0x7,'l',0x7,'l',0x7,'o',0x7


    mycode:
    mov ax,0xb800
    mov es,ax

    mov cx,10
    mov si,mydata
    mov di,0

    rep movsb  ; movsb byte ptr [ES:DI],byte ptr [DS:SI]


    stop: jmp near stop
    times 510-($-$$) db 0

    dw 0xAA55

    备注,DI指b8000~b8009       si指7c08~7c11  mydata=0x7c08

     

  • 相关阅读:
    php 读取webservice接口
    Struts2_day01--课程安排_Struts2概述_入门
    Hibernate_day04--HQL多表查询_Hibernate检索策略
    Hibernate_day04--QBC查询
    Hibernate_day04--HQL查询
    Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询
    Hibernate_day03--Hibernate多对多操作
    Hibernate_day03--课程安排_表之间关系_一对多操作
    Hibernate_day02--Hibernate事务操作_api使用
    Hibernate_day02--Hibernate的一级缓存
  • 原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/7143588.html
Copyright © 2020-2023  润新知