2019-05-31 23:51:46 jianming21 阅读数 1560


前言

逻辑操作指令包括与、或、异或、清除、求反、移位等操作,其操作数都是8位


一、简单操作指令 CLR、CPL、SWAP

CLR英文全称:Clear
CPL英文全称:Complement
SWAP英文全称:Swap


CLR A

指令名称:累加器A清0指令
目的:将累加器A中的内容清零

CPL A

指令名称:累加器A取反指令
目的:将累加器A的内容逐位取反

SWAP A

指令名称:累加器半字节交换指令
目的:将累加器A的高低两半字节交换

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
CLR A 0 -> A × × × 1 1
CPL A (/A) -> A × × × × 1 1
SWAP A (AL)<--> (AH) × × × × 1 1

AL:A0123低半字节位;
AH:A4567高半字节位;
*表示无影响,√表示有影响,下同

例 (A) = 07H 即 (A) = 0000 0111B

  • CLR A:表示A的8位都位零,(A) = 0000 0000B;
  • CPL A:表示A的内容逐位取反,(A) = 1111 1000B = F8H;
  • SWAP A:表示A的高低半字节交换,(A) = 0111 0000B = 70H。

二、位移指令 RL、RR、RLC、RRC

RL英文全称:Rotate Left
RR英文全称:Rotate Right
RLC英文全称:Rotate Left throught the Carry flag
RRC英文全称:Rotate Right throught the Carry flag


RL A

指令名称:累加器A循环移指令
目的:累加器A的内容最高位变最低位,其他位都升一位

RR A

指令名称:累加器A循环移指令
目的:累加器A的内容最低位变最高位,其他位都降一位

RLC A

指令名称:累加器A连同进位位循环移指令
目的:累加器A的内容最高位进入CY,CY位的内容进入最低位,其他位都升一位

RRC A

指令名称:累加器A连同进位位循环移指令
目的:累加器A的内容最低位进入CY,CY位的内容进入最高位,其他位都升一位

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
RL A A循环左移一位 × × × × 1 1
RR A A循环右移一位 × × × × 1 1
RLC A A带进位循环左移一位 × × 1 1
RRC A A带进位循环右移一位 × × 1 1
  • RLC可以做乘2运算;
  • 左移一位可以看作乘2,前提是第7位是0;
  • 右移一位可以看作除2,前提是第0位是0;

例无符号8位二进制数(A) = 1011 1101B = BDH, CY = 0

  • RL A:将A的第7位送入第0位,其余位提升一位,结果为:(A) = 0111 1011B

  • RR A:将A的第0位送入第7位,其余位降低一位,结果为:(A) = 1101 1110B

  • RLC A:将A的第7位送入CY中,将CY的内容送入第0位,结果为(CY) = 1,(A) = 0111 1010B,表示17AH,正好是BDH两倍;

  • RRC A:将A的第0位送入CY中,将CY的内容送入第7位,结果为(CY) = 1,(A) = 0101 1110B,A中表示57H。


三、逻辑“与”指令 ANL

ANL英文全称:ANL Logic


ANL A, XXX

目的:将累加器A中的内容和操作数所指向的内容按位进行逻辑“与”操作,结果存放在A中
源操作数:寄存器Rn、直接地址direct、间接寄存器@Ri、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ANL A, Rn (A) ∧ (Rn) -> A × × × 1 1
ANL A, @Ri (A) ∧ ((Ri)) -> A; i = 0, 1 × × × 1 1
ANL A, direct (A) ∧ (direct) -> A × × × 2 1
ANL A, #data (A) ∧ data -> A × × × 2 1
  • ANL能将某些位清零,对于想清零的位与0进行“与”逻辑,对于想保持原来的位与1进行“与”逻辑;

例 (A) = 1111 1100B = FCH,(10) = 2FH,(2FH) = 2DH,(R0) = 10H

  • ANL A, R0:结果为(A) = 0001 0000B;
  • ANL A, @R0:结果为(A) = 0010 1100B;
  • ANL A, 10H:结果为(A) = 0010 1100B;
  • ANL A, #10H:结果为(A) = 0001 0000B。

ANL direct, XXX

目的:将直接地址单元的内容和源操作数的内容按位进行逻辑“与”操作,结果存放在直接地址中
源操作数:累加器A、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ANL direct, A (direct) ∧ (A) -> direct × × × × 2 1
ANL direct, #data (direct) ∧ data -> direct × × × × 3 2

四、逻辑“或”指令 ORL

ORL英文全称:OR Logic


ORL A, XXX

目的:将累加器A中的内容和操作数所指向的内容按位进行逻辑“或”操作,结果存放在A中
源操作数:寄存器Rn、直接地址direct、间接寄存器@Ri、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ORL A, Rn (A) ∨ (Rn) -> A × × × 1 1
ORL A, @Ri (A) ∨ ((Ri)) -> A; i = 0, 1 × × × 1 1
ORL A, direct (A) ∨ (direct) -> A × × × 2 1
ORL A, #data (A) ∨ data -> A × × × 2 1
  • ORL能将某些位置一,对于想置一的位与1进行“或”逻辑,对于想保持原来的位与0进行“或”逻辑;

例 (A) = 1001 1100B = 9CH,(E1) = DFH,(DFH) = 2DH,(R0) = E1H

  • ORL A, R0:结果为(A) = 1111 1101B = FDH;
  • ORL A, @R0:结果为(A) = 1011 1101B = BDH;
  • ORL A, E1H:结果为(A) = 1101 1111B = DFH;
  • ORL A, #E1H:结果为(A) = 1111 1101B = FDH。

ORL direct, XXX

目的:将直接地址单元的内容和源操作数的内容按位进行逻辑“或”操作,结果存放在直接地址中
源操作数:累加器A、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
ORL direct, A (direct) ∨ (A) -> direct × × × × 2 1
ORL direct, #data (direct) ∨ data -> direct × × × × 3 2

五、逻辑“异或”指令 XRL

XRL英文全称:Exclusive-OR Logic


ORL A, XXX

目的:将累加器A中的内容和操作数所指向的内容按位进行逻辑“异或”操作,结果存放在A中
源操作数:寄存器Rn、直接地址direct、间接寄存器@Ri、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
XRL A, Rn (A) ⊕ (Rn) -> A × × × 1 1
XRL A, @Ri (A) ⊕ ((Ri)) -> A; i = 0, 1 × × × 1 1
XRL A, direct (A) ⊕ (direct) -> A × × × 2 1
XRL A, #data (A) ⊕ data -> A × × × 2 1
  • ORL能将某些位置取反;

XRL direct, XXX

目的:将直接地址单元的内容和源操作数的内容按位进行逻辑“或”操作,结果存放在直接地址中
源操作数:累加器A、立即数#data

助记符 功能 对标志位影响 字节数 周期数
P OV AC CY
XRL direct, A (direct) ⊕ (A) -> direct × × × × 2 1
XRL direct, #data (direct) ⊕ data -> direct × × × × 3 2

51单片机之系统指令

51单片机之数据转移指令MOV、MOVX、MOVC等

51单片机之位操作指令SETB、CPL等

51单片机之控制转移指令SJMP、LJMP等

51单片机之算术运算指令ADDC、SUBB等


由本人水平有限,文章难免有错误,望告知

2010-07-26 16:09:00 wsure 阅读数 604
MCS-51系列单片机指令以O开头的指令有8条,分别为: ORL A,Rn ORL A,direct ORL A,@Ri ORL A,#data ORL direct,A ORL direct,#data ORL C,bit ORL C,/bit
1、ORL A,Rn
  • 指令名称:逻辑或操作指令
  • 指令代码:48H~4FH
  • 指令功能:累加器内容与寄存器内容进行逻辑或操作
  • 操作内容:A1←(A)∨(Rn), n=0~7
  • 字节数: 1
  • 机器周期:1
2、ORL A,direct
  • 指令名称:逻辑或操作指令
  • 指令代码:45H
  • 操作内容:A←(A)∨(direct)
  • 字节数: 2
  • 机器周期:1
3、ORL A,@Ri
  • 指令名称:逻辑或操作指令
  • 指令代码:46H~47H
  • 指令功能:累加器内容与内部RAM低128单元内容进行逻辑或操作
  • 操作内容:A←(A)∨((Ri)); i=0,1
  • 字节数: 1
  • 机器周期:1
4、ORL A,#data
  • 指令名称:逻辑或操作指令
  • 指令代码:44H
  • 指令功能:累加器内容与立即数进行逻辑或操作
  • 操作内容:A←(A)∨data
  • 字节数: 2
  • 机器周期:1
5、ORL direct,A
  • 指令名称:逻辑或操作指令
  • 指令代码:42H
  • 指令功能:内部RAM低128单元或专用寄存器内容与累加器内容进行逻辑或操作
  • 操作内容:direct←(direct)∨(A)
  • 字节数: 2
  • 机器周期:1
6、ORL direct,#data
  • 指令名称:逻辑或操作指令
  • 指令代码:43H
  • 指令功能:内部RAM低128单元或专用寄存器内容与立即数进行逻辑或操作。
  • 操作内容:direct←(direct)∨data
  • 字节数: 3
  • 机器周期:2
7、ORL C,bit
  • 指令名称:位逻辑或操作指令
  • 指令代码:72H
  • 指令功能:累加位C状态与内部RAM可寻址位或专用寄存器指定位进行逻辑或操作
  • 操作内容:C←(C)∨(bit)
  • 字节数: 2
  • 机器周期:2
8、ORL C,/bit
  • 指令名称:位反逻辑或操作指令指令代码:A0H
  • 指令功能:累加位C状态与内部RAM可寻址位或专用寄存器指定位的反进行逻辑或操作
  • 操作内容:C←(C)∨(bit非)
  • 字节数: 2
  • 机器周期:2
  • 使用说明:指定位的状态取反后进行逻辑或操作,但并不改变指定位的原来状态。
2018-01-09 08:47:29 fengbingchun 阅读数 5704

ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。

此数据集下包含40个目录,每个目录下有10张图像,每个目录表示一个不同的人。所有的图像是以PGM格式存储,灰度图,图像大小宽度为92,高度为112。对每一个目录下的图像,这些图像是在不同的时间、不同的光照、不同的面部表情(睁眼/闭眼,微笑/不微笑)和面部细节(戴眼镜/不戴眼镜)环境下采集的。所有的图像是在较暗的均匀背景下拍摄的,拍摄的是正脸(有些带有略微的侧偏)。

可以从http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html下载此人脸数据集。

测试代码如下:

#include "funset.hpp"
#include <iostream>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>

int ORLFacestoImage()
{
	const std::string path{ "E:/GitCode/NN_Test/data/database/ORL_Faces/" };
	cv::Mat dst;
	int height, width;

	for (int i = 1; i <= 40; ++i) {
		std::string directory = path + "s" + std::to_string(i) + "/";

		for (int j = 1; j <= 10; ++j) {
			std::string image_name = directory + std::to_string(j) + ".pgm";
			cv::Mat mat = cv::imread(image_name, 0);
			if (!mat.data) {
				fprintf(stderr, "read image fail: %s\n", image_name.c_str());
			}

			//std::string save_image_name = directory + std::to_string(j) + ".png";
			//cv::imwrite(save_image_name, mat);

			if (i == 1 && j == 1) {
				height = mat.rows;
				width = mat.cols;
				dst = cv::Mat(height * 20, width * 20, CV_8UC1);
			}

			int y_start = (i - 1) / 2 * height;
			int y_end = y_start + height;
			int x_start = (i - 1) % 2 * 10 * width + (j - 1) * width;
			int x_end = x_start + width;
			cv::Mat copy = dst(cv::Range(y_start, y_end), cv::Range(x_start, x_end));
			mat.copyTo(copy);
		}
	}

	int new_width = 750;
	float factor = dst.cols * 1.f / new_width;
	int new_height = dst.rows / factor;
	cv::resize(dst, dst, cv::Size(new_width, new_height));
	cv::imwrite("E:/GitCode/NN_Test/data/orl_faces_dataset.png", dst);

	return 0;
}
执行结果如下:



2015-12-05 23:16:10 liuzehn 阅读数 13576

ORL人脸库(Olivetti Research Laboratory人脸数据库),诞生于英国剑桥Olivetti实验室。

ORL人脸数据库由该实验室从1992年4月到1994年4月期间拍摄的一系列人脸图像组成,共有40个不同年龄、不同性别和不同种族的对象。每个人10幅图像共计400幅灰度图像组成,图像尺寸是92×112,图像背景为黑色。其中人脸部分表情和细节均有变化,例如笑与不笑、眼睛睁着或闭着,戴或不戴眼镜等,人脸姿态也有变化,其深度旋转和平面旋转可达20度,人脸尺寸也有最多10%的变化。该库是目前使用最广泛的标准人脸数据库,特别是刚从事人脸识别研究的学生和初学者,研究ORL人脸库是个很好的开始。

2017-12-04 20:09:50 u012679707 阅读数 823

ORL人脸库共40个人,每人有10张照片。存储路径为 "ORL\\s1\\1.pgm",此文整理专用遍历ORL人脸文件代码
(1)代码备注:

bool traverseORL(vector<string> &filenames,vector<int> &labels,bool bTrain)    

/*
function:read ORL files (eg. s1\1.pgm)
parameter:
		--vector<string> &filenames : filepath
		--vector<int> &labels: the labels of faces
		--bool bTrain :true represents Train (No.1-No.5);
		               false represents Test(No.6-No.10)
commentray: sprintf_s write the filepath to strFilename 
*/

(2)代码实现:

bool traverseORL(vector<string> &filenames,vector<int> &labels,bool bTrain)
{
  char strFilename[100];
  int k=0;
  for(int i=1;i<=40;i++) //40 filefolders
{
  if (bTrain) // true represents Train (No1-No5)
  {
	for(int j=1;j<=5;j++){
     sprintf_s(strFilename, "F:\\Visual2012\\klabTest\\klabTest\\ORL\\s%d\\%d.pgm", i,j); //sprintf_s write the filepath to strFilename 
     filenames.push_back( strFilename ); // vector
	 labels.push_back( i );
	}
  }
  else // false represents Test(No.6-No.10)
  {
    for(int j=6;j<=10;j++){
     sprintf_s(strFilename, "F:\\Visual2012\\klabTest\\klabTest\\ORL\\s%d\\%d.pgm", i,j); //sprintf_s write the filepath to strFilename 
     filenames.push_back( strFilename );
	 labels.push_back( i );
	}
  }
 }
  for(int i=0;i<filenames.size();i++)
	  cout<<filenames[i]<<endl;

 return true;	
 

}

(3)代码测试

   vector<Mat> faces;
   vector<string> filenames;
   vector<int> labels;
   bool bTrain=true; //false;//true;
   
   traverseORL(filenames,labels, bTrain);  //read ORL files (eg. s1\1.pgm->s40\1.pgm)
(4)测试结果



没有更多推荐了,返回首页