指令实例: 寄存器寻址: (1)32位操作,使用寄存器@ACC,@XT,@P,@XARn,当@ACC作为目的操作数时,可能会影响Z,N,V,C,OVC标志位。 (2)16位操作,使用寄存器@AL,@AH,@PL,@PH,@TH,@SP,@ARn,当@AL或@AH作为目的操作数时,可能会影响Z,N,V,C,OVC标志位。对应的高16位或低16位不受影响。 数据/程序/IO空间立即寻址: (1) *(16位二进制立即数)方式,地址的高16位为0,低16位为16位二进制立即数。当该指令连续使用时,每次地址都会后加。只能寻址低64k数据空间。可用指令: MOV loc16,*(0:16bit) ; [loc16] = [0:16bit] MOV *(0:16bit),loc16 ; [loc16] = [0:16bit] (2) *(PA)方式,地址的高16位为0,低16位为PA中的16位二进制立即数。当该指令连续使用时,每次地址都会后加。该模式寻址时,在访问IO空间时,IO选通信号被置位。用数据地址线访问IO空间。可用指令: OUT *(PA),loc16 ; IOspace[0A] = [loc16] UOUT *(PA),loc16 ; IOspace[0A] = [loc16] (unprotected) IN loc16,*(PA) ; [loc16] = IOspace[0A] (3) 0:pma方式,22位的地址高6位为0,低16位为16位二进制立即数pma,当该指令连续使用时,每次地址都会后加。只能寻址低64k程序空间。可用指令: MAC P,loc16,0:pma ; ACC = ACC + P << PM,P = [loc16] * ProgSpace[0:pma] (4) *(pma)方式,22位的地址高6位为0,低16位为16位二进制立即数pma,当该指令连续使用时,每次地址都会后加。只能寻址低64k程序空间。可用指令: XPREAD loc16,*(pma) ; [loc16] = ProgSpace[0x3F:pma] XMAC P,loc16,*(pma) ; ACC = ACC + P << PM,P = [loc16] * ProgSpace[0x3F:pma] XMACD P,loc16,*(pma) ; ACC = ACC + P << PM,P = [loc16] * ProgSpace[0x3F:pma],[loc16+1] = [loc16] 程序空间间接寻址: (1) *(AL)方式,22位的地址高6位为0x3F,低16位为AL,当该指令连续使用时,AL的内容被复制到一个影子寄存器中,并在每次地址后加,AL的内容不变。只能寻址低64k程序空间。可用指令: XPREAD loc16,*AL ; [loc16] = ProgSpace[0x3F:AL] XPWRITE *AL,loc16 ; ProgSpace[0x3F:AL] = [loc16] (2) *XAR7方式,22位地址为XAR7,当在指令XPREAD或XPWRITE中连续使用时,XAR7的内容被复制到一个影子寄存器中,并每次地址后加,XAR7的内容不变。其它指令则不会。可用指令: MAC P,loc16,*XAR7 ; ACC = ACC + P << PM,P = [loc16] * ProgSpace[*XAR7] DMAC ACC,loc32,*XAR7 ; ACC = ([loc32].MSW * ProgSpace[*XAR7].MSW) >> PM, ; P = ([loc32].LSW * ProgSpace[*XAR7].MSW) >> PM QMACL P,loc32,*XAR7 ; ACC = ACC + P >> PM, ; P = ([loc32] * ProgSpace[*XAR7]) >> 32 IMACL P,loc32,*XAR7 ; ACC = ACC + P, ; P = ([loc32] * ProgSpace[*XAR7]) << PM PREAD loc16,*XAR7 ; [loc16] = ProgSpace[*XAR7] PWRITE *XAR7,loc16 ; ProgSpace[*XAR7] = [loc16] (2) *XAR7++方式,22位地址为XAR7, 16位操作时XAR7=XAR7+1,32位操作时XAR7=XAR7+2,指令重复时,地址后加。可用指令: MAC P,loc16,*XAR7++ ; ACC = ACC + P << PM,P = [loc16] * ProgSpace[*XAR7++] DMAC ACC,loc32,*XAR7++ ; ACC=([loc32].MSW * ProgSpace[*XAR7++].MSW)>>PM, ; P=([loc32].LSW * ProgSpace[*XAR7++].MSW)>>PM QMACL P,loc32,*XAR7++ ; ACC = ACC + P >> PM, P = ([loc32] * ProgSpace[*XAR7++]) >> 32 IMACL P,loc32,*XAR7++ ; ACC = ACC + P, P = ([loc32] * ProgSpace[*XAR7++]) << PM 字节寻址:
*+XARn[AR0],*+XARn[AR0],*+XARn[3位二进制立即数],32位地址为XARn+偏移量(AR0/AR1/3位二进制立即数),如果偏移量为偶数值,则访问16位存储器位置的低有效位,高有效位不变;如果为奇数,则访问16位存储器位置的高有效位,低有效位不变。其它所有寻址模式,只访问访问寻址位置的低有效位,不改变高有效位。可用指令: MOVB AX.LSB,loc16 ; if( address mode == *+XARn[AR0/AR1/3bit] ) ; if( offset == even ) ; AX.LSB = [loc16].LSB; ; AX.MSB = 0x00; ; if( offset == odd ) ; AX.LSB = [loc16].MSB; ; AX.MSB = 0x00; ; else ; AX.LSB = [loc16].LSB; ; AX.MSB = 0x00; MOVB AX.MSB,loc16 ; if( address mode == *+XARn[AR0/AR1/3bit] ) ; if( offset == even ) ; AX.LSB = untouched; ; AX.MSB = [loc16].LSB; ; if( offset == odd ) ; AX.LSB = untouched; ; AX.MSB = [loc16].MSB; ; else ; AX.LSB = untouched; ; AX.MSB = [loc16].LSB; MOVB loc16,AX.LSB ; if( address mode == *+XARn[AR0/AR1/3bit] ) ; if( offset == even ) ; [loc16].LSB = AX.LSB ; [loc16].MSB = untouched; ; if( offset == odd ) ; [loc16].LSB = untouched; ; [loc16].MSB = AX.LSB; ; else ; [loc16].LSB = AX.LSB; ; [loc16].MSB = untouched; MOVB loc16,AX.MSB ; if( address mode == *+XARn[AR0/AR1/3bit] ) ; if( offset == even ) ; [loc16].LSB = AX.MSB ; [loc16].MSB = untouched; ; if( offset == odd ) ; [loc16].LSB = untouched; ; [loc16].MSB = AX.MSB; ; else ; [loc16].LSB = AX.MSB; ; [loc16].MSB = untouched; |
|
来自: heroshishiran > 《DSP》