- movsb和movsw指令:这两个指令没有操作数,通常用于把数据从内存的一个地方批量地传送到另一个地方。movsb以字节为单位,movsw以字为单位。
原始数据串的段地址为DS,偏移地址SI。目标地址由ES:DI决定。传送的字节数或字数由CX指定。此外,还要指定是正向传送还是反向传送。正向传送指从低地址端到高地址端。正向传送时,每传送一个字节or字,SI和DI都加1或加2,反向反之。每传送一次,CX减1。 - cld是无操作数指令,方向标志清零,表示方向为正。与之相反的是std,将DF置1。
- 指令前缀rep,意思是CX不为0就重复。
- 循环指令loop:将寄存器CX的值减1,如果CX的值不为0,转移到指定的位置处继续执行,否则顺序执行后面的命令。
对于指令:
loop digit
在编译阶段,编译器用标号digit所在的汇编地址减去loop指令的汇编地址,再减去loop指令的长度(2)来得到。
- 在8086中,如果用寄存器来提供偏移地址,只能使用BX、SI、DI、BP,不能使用其他寄存器。如下面的指令都是非法的:
mov [ax],dl mov [dx],bx
- inc指令和dec指令:一个操作数,速度比add更快。
- neg指令:一个操作数,用0减去指定的操作数,即求补运算。
- 伪指令db、dw等也可以用于有符号整数
- 8086只允许以下几种基址寄存器和变址寄存器的组合:
[bx+si] [bx+di] [bp+si] [bp+di]
这些组合可以用于任何带有内存操作数的指令中。
- 指令
jns show
的意思是,如果未设置标志位,则跳转到show处执行。标志寄存器中有符号位SF。如计算结果最高位为0,则将SF=0,否则SF=1
- 标志位小结:
奇偶标志位PF:运算结果出来后,如果最低8位中,有偶数个为1的比特,则PF=1,否则PF=0
进位标志CF:算术运算中,如果有最高位向前进位或借位的情况,则CF=1,否则CF=0
溢出标志OF:假定进行有符号数运算,结果超出了目标操作数的容纳范围,则OF=1,否则OF=0
有符号位SF:如算术逻辑运算结果最高位为0,则将SF=0,否则SF=1 - 比较指令:两个操作数,不能同时为内存单元。如:
cmp al,0x08 cmp dx,bx cmp [label_a],cx
cmp指令会影响CF、OF、SF、ZF、AF、PF标志位。
- jcxz指令(jump if cx is zero):如果CX=0时则跳转
- $和$$:$等同于该行的标号;$$代表当前汇编节(段)的起始汇编地址。
- 书上源代码
;代码清单6-1 ;文件名:c06_mbr.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2011-4-12 22:12 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
转载于:https://www.cnblogs.com/hlk09/p/9783970.html