我是靠谱客的博主 羞涩眼睛,最近开发中收集的这篇文章主要介绍在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在操作之后(机械性的)设置各种状态标志,它并不知道哪些标志对程序员是重要的,程序员自己来选择解释哪些标志和忽略哪些标志.
 

  

最后

以上就是羞涩眼睛为你收集整理的在c/c++ 中嵌入汇编 (三)的全部内容,希望文章能够帮你解决在c/c++ 中嵌入汇编 (三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部