概述
0 int main()
1 {
2 BYTE tt1 = 0;
3 WORD tt2 = 0;
4 __asm
5 {
6 mov bh,300 //bh是8位寄存器,最大值为255,对应的汇编代码为: mov bh,0x2c
7 add bh,0xf0 //当bh增加0xf0时,如果不考虑bh的取值范围,bh为284,对应的值为: 0x1c
8 mov ah,bh //此时ah的值为28
9 mov tt1,ah
10 }
11 printf("第一次测试值: %d /r/n",tt1); //结果为:28
12 __asm
13 {
14 mov bx, 100; //bx是16位寄存器
15 add bx,0ffh //当bx增加ffh时,0ffh会变为00ffh进行加运算
16 mov ax,bx //此时ax的值为255
17 mov tt2,ax
18 }
19 printf("第二次测试值: %d /r/n",tt2); //结果为: 355
20 return 0;
21}
在第6行的时候,当执行mov bh,300的时候,为什么对应的汇编代码为:mov bh.0x2c,这是因为300对应的二进制为
100101100,有九位,而bh是8位寄存器,因此舍去了高位变为: 00101100正好为0x2c.
在第7行的时候,由于bh的值为0x2c,当加上0xf0后,bh的值应该为284,但由于bh的取值范围在0 ~ 255.因此将会设置进为标志。如下图所示:
0 0 1 0 1 1 0 0
+ 1 1 1 1 0 0 0 0
-------------------
1 0 0 0 1 1 1 0 0 (进位后,结果为: 0x1c)
总结:
1. 以前我也犯过这样的错误:在第7步的时候,bh的值为44,当把0xf0当作有符号整数处理的时候,0xf0就是-16,因此 44减去16刚好等于28.这只能说是巧合了。
2. 在第15步的时候,为什么0ffh会变为00ffh与bx进行加运算。因为Add指令是将同尺寸的源操作数和目的操作数进行相 加,并且是以目的操作数的尺寸为准,如果源操作数的尺寸小于目的操作数,则将加0补足。
3. 有人可能要问:CPU如何知道一个数字是有符号还是无符号?其实CPU并不知道,只有程序员才知道,CPU在操作之后(机械性的)设置各种状态标志,它并不知道哪些标志对程序员是重要的,程序员自己来选择解释哪些标志和忽略哪些标志.
最后
以上就是羞涩眼睛为你收集整理的在c/c++ 中嵌入汇编 (三)的全部内容,希望文章能够帮你解决在c/c++ 中嵌入汇编 (三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复