二、通用數(shù)據(jù)傳送指令:交換指令XCHG和換碼指令XLAT 1、交換指令用來將源操作數(shù)和目的操作數(shù)內(nèi)容交換,格式如下: XCHG reg,reg/mem ;reg←→reg/mem,也可以表達(dá)為:XCHG reg/mem,reg XCHG指令中操作數(shù)可以是字、也可以是字節(jié),可以在通用寄存器與通用寄存器或存儲器之間對換數(shù)據(jù),當(dāng)不能在存儲器與存儲器之間對換數(shù)據(jù)。 (1)XCHG指令不影響狀態(tài)標(biāo)志。 (2)段寄存器不能作為XCHG指令的操作數(shù)。 指令舉例: XCHG SI,AX XCHG AL,BL XCHG AX,[2000H] XCHG WORD_VAR,CX 數(shù)據(jù)交換程序?qū)嵗?br>例: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指定的緩沖區(qū)中、AL指定的位移處的數(shù)據(jù)取出賦給AL,格式為: XLAT LABEL XLAT ;al←ds:[bx+al] 換碼指令的兩種格式完全等效。第一種格式中,label表示首地址;第二中也可以用XLATB助記符。實(shí)際的首地址在BX寄存器中。 將首地址為100H的表格緩沖區(qū)中的3號數(shù)據(jù)取出 MOV BX,100H MOV AL,03H XLAT 因?yàn)锳L的內(nèi)容實(shí)際上是距離表格首地址的位移量,只有8位,所以表格的最大長度為256,超過256的表格需要采用修改BX和AL的方法才能轉(zhuǎn)換。XLAT指令中沒有顯式指明操作數(shù),而是默認(rèn)是用BX和AL寄存器,這種方法稱為隱含尋址方式。 換碼指令的應(yīng)用,如掃描碼轉(zhuǎn)換為ASCII碼,數(shù)字0~9轉(zhuǎn)換為7段顯示碼等 換碼程序?qū)嵗簩⒍M(jìn)制表示的十六進(jìn)制數(shù)字轉(zhuǎn)換成ASCII碼在顯示出來。根據(jù)題意,需要在數(shù)據(jù)段中定義一個換碼表,就是0,1,2,...,16所對應(yīng)的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
|