串传送指令movsb、movsw
传送前的准备工作:
DS:SI:原始数据串的段地址:偏移地址
ES:DI:目标位置的段地址:偏移地址
设置传送方向:
正向传送:原始地址和目标地址同时由低地址向高地址推进
反向传送:原始地址和目标地址同时由高地址向低地址推进
8086的标志寄存器FLAGS:
ZF只能读,不能写
DF可以改写
cld指令:方向标志清零指令,表示正方向传送
std指令:置方向标志为1的指令,表示反向传送
nasm的 $ 和 $$ 记号
$:当前这一行的汇编地址
$ $ :当前所在段的起始汇编地址
实战代码:
jmp start
mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
start:
mov ax,0x7c00 ;设置数据段基地址
mov ds,ax
mov ax,0xb800 ;设置附加段基地址
mov es,ax
cld
mov si,mytext
mov di,0
mov cx,(start-mytext)/2
rep movsw;rep指令重复次数由cx指定
jmp $
times 510-($-$$) db 0
db 0x55,0xaa
LOOP指令
loop指令的机器码:E2 8位相对偏移量
loop指令执行过程:
①将寄存器cx的内容减一
②如果cx内容不为零,转移到指定的位置处执行,否则顺序执行后面的指令
在8086处理器上,如果要用寄存器来提供偏移地址,只能使用BX、SI、DI、BP,不能使用其他寄存器
inc指令
inc r/m
inc al
inc di
inc byte [0x2002]
dec指令
dec r/m
dec al
dec di
dec byte [0x2002]
基址变址寻址
在8086处理器上,只允许以下几种基址变址组合:
bx+si
bx+di
bp+si
bp+di
条件转移指令
jns show;如果标志寄存器中符号标志位不是1,则转移到show处执行,如果是1,则往下执行,不去show处
SF是最高位
实战
jmp near start
mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
number db 0,0,0,0,0
start:
mov ax,0x7c0 ;设置数据段基地址
mov ds,ax
mov ax,0xb800 ;设置附加段基地址
mov es,ax
cld
mov si,mytext
mov di,0
mov cx,(number-mytext)/2 ;实际上等于 13
rep movsw
;得到标号所代表的偏移地址
mov ax,number
;计算各个数位
mov bx,ax
mov cx,5 ;循环次数
mov si,10 ;除数
digit:
xor dx,dx
div si
mov [bx],dl ;保存数位
inc bx
loop digit
;显示各个数位
mov bx,number
mov si,4
show:
mov al,[bx+si]
add al,0x30
mov ah,0x04
mov [es:di],ax
add di,2
dec si
jns show
mov word [es:di],0x0744
jmp near $
times 510-($-$$) db 0
db 0x55,0xaa