在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.
知识点: inc 加1指令 dec 减1指令 一.加一指令inc inc a 相当于 add a, //i++ 优点 速度比sub指令快,占用空间小 这条指令执行结果影响AF.OF.PF.SF.ZF标志位,但不影响CF进位标志位. 二.减一指令dec dec a 相当于 sub a, 004012D7 > 83E8 SUB EAX, 004012DA 836D FC SUB DWORD PTR SS:[EBP-], 004012DE INC ECX 004012DE FF41 FC INC
1.这是整形乘法指令,无论是 unsigned int 还算是 signed int 实际上指令都是进行相同的运算,只不过最终的结果是由程序中的类型来做相应的解读 2.imul 指令实际上不会发生 overflow,因为积会按乘数最大位数的两倍的位数来存放 3.二进制乘法,可以转换成对被乘数进行一些 left shift 运算, 然后求和
ret指令,相当于 pop IP:修改IP的内容,从而实现近转移 retf指令,相当于 pop IP pop CS:修改CS和IP的内容,从而实现远转移 -------------- CPU执行call指令时,进行两步操作: 1.将当前的IP或者CS和IP压入栈中: 2.转移 call指令不能实现短转移 "call 标号",这种用法是将该指令后的第一个字节的偏移地址入栈,再转到标号处执行指令 call指令的用法:http://www.cnblogs.com/LittleRedPoin
ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值. l ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,为0,为负…) CMP R0,R1 BNE NoMatch 比如上一句,BNE隐含的使用的上