一、移动数据,基本的写法

题目:我们要把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 标志。

很多指令,我们不可能一一讲解,在以后自学的过程中,大家遇到不懂的指令,自己利用搜索引擎解决。