作者:hacker发布时间:2022-07-15分类:网络黑客浏览:109评论:3
#include stdio.h
int main()
{
int a = 0;
printf("请输入a:");
if (scanf("%d",a) == 1)
{
a ^= 0x000F;
printf("结果是:%d\r\n",a);
}
else
{
printf("输入错误!\r\n");
}
printf("\r\nPress any key to continue...");
fflush(stdin);
getchar();
return 0;
}
二进制转化为八进制比如: 1010100101 step 1:分组 (把二进制三位一组从右到左分组,当左边的数字不足三位补上0) 001 010 100 101 step 2:替换(把分好的组,每组数字用一个八进制数字替换) 替换对应表: 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 那么上述的数字替换相应为1 2 4 5,那么最后的值就是1245. 二进制转化为十六进制比如: 1001010101001 step 1:分组 (把二进制四位一组从右到左分组,当左边的数字不足四位补上0) 0001 0010 1010 1001 step 2:替换(把分好的组,每组数字用一个十六进制数字替换) 替换对应表: 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 a 1011 b 1100 c 1101 d 1110 e 1111 f 那么上述的数字替换相应为1 2 a 9,那么最后的值就是12a9. 二进制转化为十进制: 110101001.101 step 1: 授权(给每个二进制位授予不一样的位权,从小数点开始往左边数,分别是1,2,4,8......,也就是2的几次方,这里不好写,我就直接算出来,小数点往右边数,就是1/2 ,1/4,1/8.......,) step 2: 位权与权值相乘(将各个位的数字与位权相乘相加) +1X256+1X128+0X64+1X32+0X16+1X8+0X4+0X2+1X1+1X1/2+0X1/4+1X1/8=..十进制转化为二进制: 125.125 step 1: 分类(将整数位和小数位分为两个部分,分别求解) step 2: 整数求解(将整数位数字对二进行反向取余,一直除到商位0为止) 125 / 2 = 64 ...........1 64 / 2 = 32 ............0 32/2 = 16.............0 16/2 = 8..............0 8/2 = 4..............0 4/2 = 2...............0 2/2 = 1................0 1/2 = 0...............1 (商为0停止) 那么整数部分结果就是从下往上看余数为 10000001. step 3: 求解小数(求解小数用到的是将小数一直乘以2,依次取出每次乘以2结果的整数部分) 0.125X2=0.25 (整数部分为0,取出) 0.25X2=0.5 (整数部分为0,取出) 0.5X2=1.0 (整数部分为1,取出)最后小数部分就是001step 4:合并两部分 那最后的结果就是10000001.001至于八进制与十六进制之间的转化就是将二进制中的2换为相应的8和16.需要注意的是十六进制中有a,b,c,d,e,f的余数,而不是10,11,12,13,14,15.对于其他的也没有什么不一样的地方了。 如果我的回答得到你的满意请支持一下我朋友的网站 Thank you !!!!
普林斯顿结构,它采用了不在程序与数据的存储上进行逻辑区分的设计思想,这种设计思想在通用计算机和通用微型计算机中被广泛使用。
mcs-51单片机 就是基于这种结构 MCS-51汇编语言程序的一般格式
与8086不同,没有代码段、数据段等区分,统一编址。
程序由指令行或注释行组成,指令行每行只能写一条指令。
指令前可用“标号:”表示指令地址,以便在指令中引用;标号是符号名,以字母开头。
注释行应以“;”号开头;指令后也可用“;”号分隔,附加注释。
程序由伪指令ORG XXXXH 定位,ORG中的16位地址就是将来写入程序存储器的绝对地址。程序中的ORG应按地址从小到大排列。由ORG定位的程序段可以不连续,汇编程序将会在段间的空地址上填00H,即NOP。因此,每个ORG段的最后一条指令一般应是转移指令。
数据由伪指令DB(字节)或DW(双字节)说明。数值应以数码0-9开头;尾缀说明:B-二进制,D-十进制,H-十六进制。十进制D可缺省。
也就是说你可以想象你的数据空间是从0000-FFFF
因为你在编程时你只能操纵这个区,而程序性指令如JUMP永远不会跳到数据区的
所以一个简单的初始化可以这样来做
MOV R0,#00H
MOV A,#00H
MOV R1,#FFFFH
loop:
MOV@R0,A
INC R0
DANZ R1,loop
将0000-FFFF全置零了
如果用C来写可以这样吧
memset(0000,0000,FFFF) /*add,int val,int count */
如果memset函数可以使用的话.
我总觉的void pokeb(int segment,int offset,int value) 将字节value写到segment:offset处
这个涵数无法使用。因为mcs-51没段概念。
参考
如果随意对一个累加器A中的二进制数据进行“二进制转十进制”调整是没有任何实际意义的!
DA调整的对象是在ADD或ADDC之后的结果,而且是以BCD码相加以后才能够调整,否则没有实际意义!
比如,现在要执行12D+39D也就是两个十进制数相加这样一个加法(有时候程序处理的需要,数据在单片机中是以BCD码的形式存储的,也就是12H和39H(十六进制),但我们可以人为将它们看为12D和39D(十进制),而且还希望相加以后的结果为51H,也就是说符合十进制运算规则12+39=51,而不是4BH的结果),但这样的十进制加法运算在单片机中是不能够直接实现的。因为单片机只能够执行二进制加法指令,也就是所有的运算都按照二进制中的规则进行!
于是就出现了DA调整指令!
现在12H+39H,将12H放于A中,执行 ADD A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA A 指令后,就会将A中的数据调整为51H(具体调整过程和原理你可以详细看书,如果单片机书中讲的不详细,那么微机原理中一定说的非常详细),而我们按照BCD码规则就将其看为51D,符合我们的要求!
也就是说加数和被加数都是BCD码的形式,最大也只可能是99H,也就是我们十进制数中的99,只有这样才会有实际的意义!所以你说的当A=#24H的时候的情况是不会存在的,严格的说是没有意义的!
而且DA A指令只用于十进制BCD码加法指令 ADD/ADDC 以后,否则是没有实际意义的!
谢谢!
参考
顺序编程,分支编程,循环编程,子程序调用:
;p1口八个灯作跑马灯。
org 0000h
ajmp start
org 0030h
start:
mov a,#0ffh ;
clr c ;
mov r2,#08h ;循环八次。
loop: rlc a ;带进位左移。
mov p2,a ;输出到P1口。
call delay ;延时一段时间
djnz r2,loop ;反复循环
mov r2,#07h ;再往回循环。
loop1:
rrc a ;带进位右移
mov p2,a ;输出到P1口。
call delay ;延时一段时间
djnz r2,loop1 ;反复循环
jmp start ;重新开始
delay:
mov r3,#20 ;延时子程序
d1: mov r4,#200
d2: mov r5,#248
djnz r5,$
djnz r4,d2
ret
end
查表编程:
;例程:100
标签:进制定位转移
已有3位网友发表了看法:
访客 评论于 2022-07-15 17:37:18 回复
7 那么上述的数字替换相应为1 2 4 5,那么最后的值就是1245. 二进制转化为十六进制比如: 1001010101001 step 1:分组 (把二进制四位一组从右到左分组,当左边的数字不足四位补上0) 0001 0010
访客 评论于 2022-07-15 10:30:29 回复
在指令中引用;标号是符号名,以字母开头。注释行应以“;”号开头;指令后也可用“;”号分隔,附加注释。程序由伪指令ORG XXXXH 定位,ORG中的16位地址就是将来写入程序存储器的绝对地址。程序中的ORG应按地址从小到
访客 评论于 2022-07-15 18:29:48 回复
,也就是所有的运算都按照二进制中的规则进行!于是就出现了DA调整指令!现在12H+39H,将12H放于A中,执行 ADD A,#39H指令,则结果为4BH,这不是我们希望的51H的数据形式!!这时执行DA A 指令后,就