超级搬运工
前我們往屏幕輸出了一個Hello,費了老大的勁。
有沒有什么更簡單的方法呢?
當然有啦。
我們把所有的文字對應的Ascll碼統(tǒng)一放到一塊內存里面。
再把這些東西統(tǒng)一搬進去顯存里面。
?
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=是以字節(jié)進行復制
movsw=是以兩個字節(jié)(字)進行復制
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
?
轉載于:https://www.cnblogs.com/xiaodaxiaonao/p/7143588.html
總結
- 上一篇: JS获取当前日期时间并定时刷新
- 下一篇: 国际电信联盟(ITU)发布最新IDI指数