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