梯形图程序:
(原文件名:test.jpg)
语句表代码:
LD X1
OR X2
AND X3
OUT Y1
对应的汇编代码:
LD X1
__asm (
"movw r5, 0x4\n"
"movt r5, 0x2204\n" //将X1地址放进寄存器R6中,注意:0x2204004是X1的位绑定地址
"ldrb r6, [r5,#0]\n" //将X1地址的值放进寄存器R5中
"lsl r4, r4,#1\n" //R4是运行堆栈 左移一位
"orr r4, r6\n" //R4与R6相或,这样R4的最后一位就是X1中的值
: : :"r4", "r5", "r6" //告诉编译器 这几个地址代码修改
);
OR X2
__asm (
"movw r5, 0x8\n"
"movt r5, 0x2204\n"
"ldrb r6, [r5,#0]\n"//将X2的值读到R6中去
"orr r4, r6\n"//R4与R6相或 ,此时R4的最后一位是X1|X2
: : :"r4", "r5", "r6"
);
AND X3
__asm (
"movw r5, 0xc\n"
"movt r5, 0x2204\n"
"ldrb r6, [r5,#0]\n"//将X3的值读到R6中去
"tst r6, 0x1\n"//检测R6的最后一位,也就是X3的值
"it eq\n"
"biceq r4, r4,0x1\n"//如果X2==0 R4最后一位需要复位,否则不用动
: : :"r4", "r5", "r6"
);
OUT Y1
__asm (
"movw r5, 0x1004\n"
"movt r5, 0x2204\n"
"tst r4, 0x1\n"//检测位堆栈R4最后一位
"ite eq\n"
"moveq r6, 0x0\n"//如果R4最后一位 为0
"movne r6, 0x1\n"//如果R4最后一位 为1
"strb r6, [r5],#0\n"//将R6输出到 地址Y1中
: : :"r4", "r5", "r6"
);
运行监控画面:
(原文件名:monitor.jpg) |