首页 > 代码库 > 超级搬运工

超级搬运工

前我们往屏幕输出了一个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

超级搬运工