Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 标志、进位和溢出标志(组件)_Assembly - Fatal编程技术网

Assembly 标志、进位和溢出标志(组件)

Assembly 标志、进位和溢出标志(组件),assembly,Assembly,如果使用ADD指令将val2增加1,进位的值是多少 然后签名 如果使用ADD指令将val4增加1,则Over的值是多少- 流和签名标志 我两个都答错了。为什么答案是这样的?1.指定平台标志可以在不同的平台上进行不同的设置 2.使用的指令的位宽是多少 .data val1 BYTE 10h val2 WORD 8000h val3 DWORD 0FFFFh val4 WORD 7FFFh 大多数CPU不处理带符号的数字,而是使用2'os补码二进制表示 试图总结大多数评论中已经讨论过的内容 x8

如果使用ADD指令将val2增加1,进位的值是多少 然后签名

如果使用ADD指令将val4增加1,则Over的值是多少- 流和签名标志


我两个都答错了。为什么答案是这样的?

1.指定平台标志可以在不同的平台上进行不同的设置

2.使用的指令的位宽是多少

.data
val1 BYTE 10h
val2 WORD 8000h
val3 DWORD 0FFFFh
val4 WORD 7FFFh
  • 大多数CPU不处理带符号的数字,而是使用2'os补码二进制表示

    • 试图总结大多数评论中已经讨论过的内容

      x86,以及到目前为止我所看到的所有其他处理器体系结构,都没有真正意义上的有符号和无符号数字。由您的解释确定16位值
      8000h
      是+32768(无符号)还是-32768(有符号)

      没有单独的有符号和无符号指令进行加法和减法;同样,您可以决定
      7FFFh+0001h
      是有效的(无符号)加法还是溢出(因为
      7FFFh
      是16位2的补码中的最大有符号整数)

      为了帮助程序员,算术运算为两种解释都设置了标志。操作完成后,测试相应的标志。经验法则:

      • 对于有符号的数字,测试溢出符号标志
      • 对于无符号数字,测试进位标志;它或多或少起到“未签名溢出”的作用
      示例:

      • 7FFFh+1
        有符号时溢出(设置了OF),无符号时溢出(CF=0);签名时结果8000h为负(SF=1)
      • FFFFh+1
        未签名时溢出(设置CF),未签名时溢出(OF=0);结果0000h不为负(SF=0)

      把它想象成一种模拟时钟。在真正的时钟中,“六五五”(55)和“五到七”(-5)的时间是相同的。这只是你定义的问题,时钟本身并不知道你的定义,它一圈一圈地运行着。。。CPU也是如此。查看以下“CPU时钟”:

      我选择了4位时钟,但其原理与其他每一组位(字节、字、双字等)相同

      时钟从15跳到0后,将设置进位标志。在本例中,它是无符号溢出的标志

      溢出标志将在时钟从7跳到-8后设置。它标记签名溢出

      符号标志标记可解释为负数的值

      如果向下计数,则标志的行为略有不同:


      “我两个都回答了”。你回答了什么?我说的第一个问题都是0,因为val2是一个无符号字节,加一不会使它为负。答案是符号标志是1。第二个问题我又说了0。答案是都是1。哦,我明白了,你误解了我的意思。我这样措辞是为了避免引导你的答案,尽管我不太可能这样做。这只是一种预防措施。
      val2
      被声明为一个
      单词
      。假设这是针对x86的(您没有指定CPU体系结构),一个字是16位。所以它不是一个字节。此外,该值可以同时被视为有符号和无符号。选择哪种查看方式取决于您使用的说明。符号是操作最高位的副本第二个问题要求的是溢出标志,而不是进位标志。是的,对不起。它说的仍然是=1,尽管。。。您在答案中加入了进位。@user3682802 x86如果我的内存运行良好,则添加溢出与进位相同“如果我的内存运行良好,则添加溢出与进位相同”。不是真的。如果您添加两个具有相同符号的数字并得到具有不同符号的结果,则会发生溢出。
       8000h
      +0001h
      ------
       8001h -> Carry=0,Sign16=1
      
       7FFFh
      +0001h
      ------
       8000h -> Carry=0,Sign16=1