汇编语言的TEST指令可不可以详细解释教我呢最好有例子.THANKS!

汇编语言的TEST指令可不可以详细解释教我呢最好有例子.THANKS!,第1张

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语言和汇编语言的关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9449290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存