三十八、movsb和rep movsb指令,DF标志位
一、移动数据,基本的写法
题目:我们要把5个字节复制到内存地址0x00500
;0x00500 = 0xAA
;0x00501 = 0x11
;0x00502 = 0x22
;0x00503 = 0x33
;0x00504 = 0x44
写法1:直接移动
mov ax, 0x0050
mov es:ax ;目标地址段寄存器初始化
mov ax, 0x07c0
mov ds:ax ;原始地址段寄存器初始化
jmp near Code
Data:
db 0xAA,0x11,0x22,0x33,0x44
Code:
mov al,byte[ds:Data+0]
mov byte[es:0],al
mov al,byte[ds:Data+1]
mov byte[es:1],al
mov al,byte[ds:Data+2]
mov byte[es:2],al
mov al,byte[ds:Data+3]
mov byte[es:3],al
mov al,byte[ds:Data+4]
mov byte[es:4],al
end:
jmp 0x07C0:end
times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA
写法2:使用loop
mov ax, 0x0050
mov es:ax ;目标地址段寄存器初始化
mov ax, 0x07c0
mov ds:ax ;原始地址段寄存器初始化
jmp near Code
Data:
db 0xAA,0x11,0x22,0x33,0x44
Code:
mov si, Data
mov di, 0
mov cx, Code-Data
StartMove:
mov al,byte[ds:si]
mov byte[es:di],al
inc si
inc di
loop StartMove
end:
jmp 0x07C0:end
times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA
二、移动数据,movsb 和 rep movsb指令的使用
movsb:move string byte
字节传送指令
所以,上述代码可以这样理解:
- 1.初始化数据的原始内存地址。
- 2.初始化数据的目标内存地址。
- 3.初始化数据的长度,或者说移动次数。
- 4.初始化移动的方向。
- 5.每次移动的时候,移动几个字节。
在我们汇编指令中,有一个指令,它的作用就是专业负责,把一个地方的内存数据,复制到另外一个地方。
movsb byte[es:di],byte[ds:si] ;movsb 目标地址,源地址
正常 movsb
指令不需要带参数,上面只是为了显示效果让人容易理解
并且每次这条指令执行完成之后,di和si都会加1,或者减1。
DF=Direction Flag
- 当DF标志位=0的时候,movsb指令执行完成之后, di和si就会加1。
- 当DF标志位=1的时候,movsb指令执行完成之后, di和si就会减1。
那我们如何设置DF标志寄存器的值呢?
- cld(clear direction)就会把DF变成0。
- std(set direction)就会把DF变成1。
mov ax, 0x0050
mov es:ax ;目标地址段寄存器初始化
mov ax, 0x07c0
mov ds:ax ;原始地址段寄存器初始化
jmp near Code
Data:
db 0xAA,0x11,0x22,0x33,0x44
Code:
mov ax, 0x0050
mov es, ax ;目标地址段寄存器初始化
mov di, 0 ;目标地址偏移寄存器初始化
mov ax, 0x07C0
mov ds, ax ;原始地址段寄存器初始化
mov si, Data ;原始地址偏移寄存器初始化
mov cx, Code-Data
rep movsb ;rep movsb是一条指令,判断cx不等于0时,重复执行movsb。
end:
jmp 0x07C0:end
times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA
使用 std指令, 反方向,从后面开始移动
mov ax, 0x0050
mov es:ax ;目标地址段寄存器初始化
mov ax, 0x07c0
mov ds:ax ;原始地址段寄存器初始化
jmp near Code
Data:
db 0xAA,0x11,0x22,0x33,0x44
Code:
mov ax, 0x0050
mov es, ax ;目标地址段寄存器初始化
mov di, 0+4 ;目标地址偏移寄存器初始化
mov ax, 0x07C0
mov ds, ax ;原始地址段寄存器初始化
mov si, Data+4 ;原始地址偏移寄存器初始化
std
mov cx, Code-Data
rep movsb ;rep movsb是一条指令
end:
jmp 0x07C0:end
times 510 - ($ -$$) db 0x00
dw 0xAA55 ; 相当于 db 0x55,0xAA
DF
标志位(Direction Flag
),我们都知道是方向标志位。DF
标志位会影响(movs,cmps,scas,lods以及stod
)指令STD
以及 CLD
指令分别设置以及清除 DF
标志。
很多指令,我们不可能一一讲解,在以后自学的过程中,大家遇到不懂的指令,自己利用搜索引擎解决。