TEST指令和AND指令差不多,只是AND指令执行后会把结果送到目的 *** 作数,而TEST却不会,只是影响标志位例如:测试AL中的bit3位,使用TEST AL,08H.若ZF=1,表示该位是0,若ZF=0,那么该位表示1.用哪个数来测试寄存器的位,例
*** 作数是运算符作用于的实体,是表达式中的一个组成部分,它规定了指令中进行数字运算的量 。
*** 作数指出指令执行的 *** 作所需要数据的来源。 *** 作数是汇编语言指令的一个字段。例如:Mov AX 5678H *** 作数(AX 5678H)。在 *** 作数这个字段中可以放 *** 作数本身,也可以放 *** 作地址,还可以放 *** 作地址的计算方法。
通常一条指令均包含 *** 作符和 *** 作数。例如:在比较指令中 *** 作符指定计算机做比较 *** 作, *** 作数则指定进行比较的两个数值。
扩展资料:
*** 作数的形式
立即 *** 作数:指令要 *** 作的数据以常量的形式出现在指令中,称为立即数,它只能作为源 *** 作数。
寄存器 *** 作数:指令要 *** 作的数据存放在CPU中的寄存器里,指令中给出寄存器名即可。
内存 *** 作数:指令要 *** 作的数据存放在内存某些单元中,指令中给出内存单元物理地址(实际上指令只给出了偏移地址,段地址采用隐含方式给出,也可以使用跨段方式指出当前段地址)。
参考资料来源:百度百科- *** 作数
程序员编写的C语言代码,首先要经过C语言编译器,生成汇编代码,这个过程称为编译阶断,当C语言编译器生成汇编代码后,再调用汇编器来将汇编代码编译成汇编指令。
这是一种站在巨人肩人的作法,最早的C++编程语言也是这样的实现方法,只不过那时候叫Cfront程序,Cfront程序的作用是将C++代码转换成C语言代码,类似于一个文本处理器,然后再调用C语言编译器,将C源码编译成汇编代码,然后再调用汇编器将汇编代码编译成机器码。
这个过程,在Windows平台上不容易 *** 作,但是在Linux平台上很容易看到。以gcc这款c语言编译器为例,它实际上是四个小程序。
cp: c语言预处理程序,有它负责进行预处理 *** 作。
cc: C语言编译器,它负责将C源码编译成汇编代码。
as: 汇编器,它负责将汇编代码编译成机器码,一般使用gcc testc这样的命令编译C语言时,会生成一个aout的程序,它实际上指的就是as ouput,即汇编器输出文件。
link: 链接器,它负责将汇编器输入的机器码和库打包成一个 *** 作系统可以运行的可执行文件,在Linux上的可执行文件格式是ELF格式,这个格式的实现是有链接器来完成的。
在要指定代码的存储空间不是一件特别简单的事情,尤其是你想为某个或某几个函数指定具体的地址。
1,编译器只有在最终的Link阶段才会为代码和数据分配内存地址,因此指定代码段的地址一般是通过写一个link脚本来进行的。Link阶段时,编译器的Linker会读取你写的Link脚本,并且按照脚本的规定给代码分配地址。
2,根据ARM开发工具的不同,link脚本的语法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等开发工具都支持Link脚本。
如果你英文还可以,建议你直接找到开发工具的Help手册去研究。如果你英语实在不行,也可以把开发工具名称和你代码的具体情况告诉我,我帮你看看。
12系列有熔丝位,由烧写器设置的,第一个问题是你未改熔丝位,问你是否确认。第二个是写OSCAL要用RETLW指令,而你用的是MOVLW指令。
我记得内部RC振荡是在熔丝位设的,选择振荡源,频率是确定的。
以下是从键盘输入一个一位数的程序,赋值给CX,输入等于0则什么都不做,不等于0则输出“cx != 0”,经调试通过
DATA SEGMENT
IN_A DB 'INPUT: CX =','$'
OUT_A DB 'OUTPUT: CX != 0','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC FAR
MOV AX, DATA
MOV DS, AX
MOV AH, 9 ;输出"CX ="
LEA DX, IN_A
INT 21H
MOV AH, 0 ;从键盘输入一个数字赋值给CX
INT 16H
XOR AH, AH ;清零AH
MOV CX, AX
SUB CX, 30H ;需要将从键盘接受的字符的ASCII码转为数字(ASCII码=数字+30H)
MOV AH, 2 ;设置光标位置1行0列
MOV BH, 0
MOV DH, 1
MOV DL, 0
INT 10H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CMP CX, 0 ;比较CX和0的大小
JE EXIT ;相等则跳转到EXIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AH, 9 ;CX不等于0才会执行该语句,输出CX != 0
LEA DX, OUT_A
INT 21H
EXIT: ;CX=0程序什么都不做直接退出
MOV AX, 4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
现在我没有时间,先回答一题。如果要其它答案的话,可以加我的Q369881068,但是要给分我哦!
第一题:
DATA SEGMENT
WANG DB 1,-2,3,4,5,6,7,8,9,10 ;现在只放10个数
XIAO DB 10 DUP ()
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,10
MOV BX,0
LEA SI,XIAO
L:MOV AX,0
MOV AL,WANG[BX]
SHL AL,1
JC TURN
MOV AL,WANG[BX]
JMP Q
TURN:MOV AL,WANG[BX]
NEG AL ;负数换成正数
Q:MOV [SI],AL
INC SI
INC BX
LOOP L
MOV AH,4CH
INT 21H
CODE ENDS
END START
结束。
想知道哪种,给你粘贴,下面是一些计算子程序
;
;一、十六位二进制转换为BCD数子程序
;
MOVLW 10H ;
MOVWF CNT ;
BCF STATUS,C ;
CLRF R2 ;
CLRF R1 ;
CLRF R0 ;
LOOP RLF AL ;
RLF AH ;
RLF R0 ;
RLF R1 ;
RLF R2 ;
DECFSZ CNT ;
GOTO ADJDEC ;
RETURN
ADJDEC MOVLW R0 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R1 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R2 ;
MOVWF FSR ;
CALL ADJBCD ;
GOTO LOOP ;
ADJBCD MOVLW 3H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,3 ;
MOVWF INDF ;
MOVLW 30H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,7 ;
MOVWF INDF ;
RETURN
;
;乘法宏
;两个八位无符号数乘法,乘积为十六位。部分积右移相加算法:乘数带进位右移一位,
;检查进位是否为一,若是一,部分积寄存器加被乘数,否则不加;然后部分积寄存器
;带进位右移一位;重复上述过程直至循环次数为八结束。
;
;宏的引用格式:MUL A,B
;完成 *** 作: (A)(B)---(A,B)
;影响状态位:C、Z和DC
;88位乘法宏MUL,结果的高字节部分存入(A),低字节存入(B)
;
MUL MACRO A,B ;
LOCAL MLOOP ;
;
;如只用乘法子程序,就下段。
;
CLRF TMPA ;
CLRF TMPB ;
MOVLW 8 ;
MOVWF CNT ;
MOVF A,W ;
BCF STATUS,C ;
MLOOP RRF B ;
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB ;
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF A ;
MOVF TMPB,W ;
MOVWF B ;
;
ENDM
;
;除法宏DIV
;除法是乘法的逆运算。与十进制长除法类似,从被除数的最高有效位开始,把被除数左移
;一位至余数上,如果余数不够减去除数,则商寄存器左移,移入位为零,反之移入位为一
;余数减去被除数,把被除数的下一位移至除数上。重复上述过程直至处理完所有位。
;
;宏的引用格式:DIV A,B
;完成 *** 作: (A)为商部分,(B)为余数部分
;影响状态位:C、Z和DC
;8/8位除法宏DIV,结果(A)为商部分,(B)为余数部分
;
DIV MACRO A,B ;
LOCAL MLOOP ;
;
;如只用除法子程序,就下段。
;
MOVF A,W ;
MOVWF TMPA ;
MOVF B,W ;
MOVWF TMPB ;
MOVLW 8 ;
MVOWF CNT ;
CLRF A ;
CLRF B ;
DLOOP BCF STATUS,C ;
RLF TMPA ;
RLF B ;
MOVF TMPB,W ;
SUBWF B,W ;
BTFSC STATUS,C ;
MOVWF B ;
RLF A ;
DECFSZ CNT ;
GOTO DLOOP ;
;
ENDM ;
;
;间接寻址
CLRF R0 ;清除R0寄存器里的内容
MOVLW R0 ;
MOVWF FSR ;将R0寄存器的地址送入间接寻址指针FSR
MOVF INDF,0 ;
MOWF TEMP ;将间接寻址指针FSR所指地址R0寄存器里的内容送入TEMP
MOVLW 88H ;
MOVWF INDF ;将88H送入间接寻址指针FSR所指地址R0寄存器里
;
;将两位BCD数送入显示
;显示十位BCD数
DISPLAY SWAPF TEMP,W ;将TEMP寄存器里的内容的高低字节交换并送入W
ANDLW 0FH ;将0FH与W寄存器里的内容相与并送入W
CALL CODE_TAB ;查表取段码
MOVWF PORTD ;送入PORTD端口
MOVLW 1H ;
MOVWF PORTC ;选通PORTC,1
CALL DELAY ;调用延时
;显示个位BCD数
MOVF TEMP,W ;
ANDLW 0FH ;
CALL CODE_TAB ;
MOVWF PORTD ;
MOVLW 2H ;
MOVWF PORTC ;
CALL DELAY ;
;
;16位二进制除以8位二进制
;
DIV16
MOVF A,0
MOVWF DIV_H
MOVF BX,0
MOVWF DIV_L ;被除数高低字节分别送进各寄存器
MOVLW 9H
MOVWF DIVB ;将除数送进寄存器
MOVLW 10H
MOVWF CNT ;按被除数位数设定移位次数
CLRF AL
CLRF AH
CLRF BX
DLOOP
BCF STATUS,C
RLF DIV_L
RLF DIV_H
RLF BX
MOVF DIVB,W
SUBWF BX,W
BTFSC STATUS,C
MOVWF BX
RLF AL
RLF AH
DECFSZ CNT
GOTO DLOOP
RETURN
;
;8位乘以16位二进制乘法运算程序
;
MUL8
CLRF TMPA ;清除积的高位寄存器
CLRF TMPB ;清除积的中位寄存器
CLRF TMPC ;清除积的低位寄存器
MOVLW 10H ;因为8位二进制乘以16位二进制,乘数为16位,移位乘数,所以移位次数为16次
MOVWF CNT ;
MOVF BX,W ;将8位被乘数送进W
BCF STATUS,C;
MLOOP RRF TEMP_H ;
RRF TEMP_L ;带C循环右移16位乘数
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB
RRF TMPC
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF AA ;
MOVF TMPB,W ;
MOVWF A
MOVF TMPC,W ;将乘积送进各寄存器。
MOVWF BX
RETURN
以上就是关于汇编语言的TEST指令可不可以详细解释教我呢最好有例子.THANKS!全部的内容,包括:汇编语言的TEST指令可不可以详细解释教我呢最好有例子.THANKS!、汇编语言里 *** 作数是什么啊 尽量详细多举例子、C语言和汇编语言的关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)