| 二、通用数据传送指令:交换指令XCHG和换码指令XLAT 1、交换指令用来将源操作数和目的操作数内容交换,格式如下: XCHG reg,reg/mem ;reg←→reg/mem,也可以表达为:XCHG reg/mem,reg XCHG指令中操作数可以是字、也可以是字节,可以在通用寄存器与通用寄存器或存储器之间对换数据,当不能在存储器与存储器之间对换数据。 (1)XCHG指令不影响状态标志。 (2)段寄存器不能作为XCHG指令的操作数。 指令举例: XCHG SI,AX XCHG AL,BL XCHG AX,[2000H] XCHG WORD_VAR,CX 数据交换程序实例: 例:LI7-1.ASM 将S1串与S2串交换 NAME LI7-1.ASM DATA SEGMENT S1 DB 'ABCDEFG' S2 DB '0123456' N DW $-OFFSET S2 ;N为字符串长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,N L1: MOV AL,S1[SI] ;S1[SI]与S2[SI]交换 XCHG AL,S2[SI] MOV S1[SI],AL INC SI ;(SI)+1—〉SI LOOP L1 MOV CX,N ;显示S1串 MOV SI,0 MOV AH,02H L2: MOV DL,S1[SI] INT 21H INC SI LOOP L2 MOV DL,' ' INT 21H MOV CX,N ;显示S2串 MOV SI,0 L3: MOV DL,S2[SI] INT 21H INC SI LOOP L3 MOV AH,4CH INT 21H CODE ENDS END START 2、换码指令用于将BX指定的缓冲区中、AL指定的位移处的数据取出赋给AL,格式为: XLAT LABEL XLAT ;al←ds:[bx+al] 换码指令的两种格式完全等效。第一种格式中,label表示首地址;第二中也可以用XLATB助记符。实际的首地址在BX寄存器中。 将首地址为100H的表格缓冲区中的3号数据取出 MOV BX,100H MOV AL,03H XLAT 因为AL的内容实际上是距离表格首地址的位移量,只有8位,所以表格的最大长度为256,超过256的表格需要采用修改BX和AL的方法才能转换。XLAT指令中没有显式指明操作数,而是默认是用BX和AL寄存器,这种方法称为隐含寻址方式。 换码指令的应用,如扫描码转换为ASCII码,数字0~9转换为7段显示码等 换码程序实例:将二进制表示的十六进制数字转换成ASCII码在显示出来。根据题意,需要在数据段中定义一个换码表,就是0,1,2,...,16所对应的ASCII码表: TAB_DA DB 30H,32H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H 或者是: TAB_DA DB '0123456789ABCDEF' 完整程序如下: NAME LI7-2.ASM TABLE SEGMENT TAB_DA DB 30H,32H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H TAB_HEX DB 0,1,2,3,4,5,6,7,8,9 DB 0AH,0BH,0CH,0DH,0EH,0FH TABLE ENDS CODE SEGMENT ASSUME CS:CODE,DS:TABLE START: MOV AX,TABLE MOV DS,AX MOV CX,10H MOV BX,OFFSET TAB_DA MOV SI,OFFSET TAB_HEX NEXT: MOV AL,[SI] XLAT TAB_DA MOV DL,AL MOV AH,02H INT 21H MOV DL 00H MOV AH,02H INT 21H INC SI LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
|