汇编MOV WORD PTR[SI], 10F什么意思
WORD PTR [SI] ;这是强制定义为字大小mov ds:[si],10f ;这是不允许的操作,因为si指向的空间只有8bit(1byte)大小,所以mov WPRD PTR ds:[SI],10f就是为了告诉CPU mov的源地址是2byte大小的,10f是可以存储进去的.10f需要占用9bit,而存储器内最小空间是1字节所以10f在存储器内需要占用2byte大小的内存空间...
printf("%f\n",5)的输出结果为什么是0.000000
1,之所以没输出5,这是C语言设计的原因。
2,之所以输出0,这是计算机体系结构的问题。
具体来说:printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。
C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。
这点就和huhugo88所说一样,5在内存中为00000000,00000101。
而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)*(基数2)pow(指数)的方式来取数,自然结果是0之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。
按理说,这样访问内存是属于越界访问,应该禁止。
不过只是读,伤害性不大而已。
汇编指令word ptr
int GetSum(int val) //使用汇编求1+2+3+...+val的值{ int sum = 0; __asm__ __volatile__( "MOV R5 , %1\n"//val放入寄存器r5 "MOV R1 , #0\n" //sum = 0 "MOV R2 , #1\n"//i = 1 "LOOP:\n" " ADD R1 , R1 ,R2\n" //sum = sum + i " ADD R2 , R2 ,#1\n" //i++ " CMP R5 , R2\n" //判断 i 是否等于val if(i==val) " BEQ END\n" //若相等 跳转至END处 break " B LOOP\n" //若不相等 跳转至LOOP处进入下次循环 else continue "END:\n" "MOV %0 , R1\n" //sum = R1 :"=r"(sum)//输出 :"r"(val)//输入 :"memory" ); return sum;}随便写了个求和的例子 其余的循环大同小异 不懂可以继续探讨 运行之前请交叉编译然后在ARM平台上运行...
谁帮我把下面每一行的汇编语言解释翻译一下,谢谢啦~
DWORD_PTR的定义是, 这个类型至少可以确保放得下DWORD并且确保放得下一个指针。
DWORD的长度是固定得32位, 而指针的长度是跟硬件、系统、编译器什么的有关系的。
所以如果你是在做32位程序,那么 DWORD_PTR就跟DWORD是一回事。
如果你是在做64位程序,那么 DWORD_PTR是64位的, 而DWORD永远是32位。
...
转载请注明出处51数据库 » 汇编 qword ptr