在c/c++ 中嵌入汇编 (三)

  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在操作之后(机械性的)设置各种状态标志,它并不知道哪些标志对程序员是重要的,程序员自己来选择解释哪些标志和忽略哪些标志.
 

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值