. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于转移指令loop  [已解决] 回复[ 7次 ]   点击[ 312次 ]  
realbit
[帖 主]   [ 发表时间:2011-12-02 15:59 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
大家想过没有,如果cx是负数,是不是会陷入死循环?
王爽老师的书没有深入的讲解数学运算的东西,在看9.8节 检测点9.2的时候我想了这个问题。
其实应该不会陷入死循环,因为溢出的话又会回到起点。
希望王爽老师可以添加相关内容
tomato
[第1楼]   [ 回复时间:2011-12-02 16:08 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
负数在计算机中是以补码形式存在的,计算机会把它当成正数运算的。所以,不存在楼主说的问题。另外,给楼主提个建议,以我们现在的这种认识,什么是什么都还不清楚,我们是没有资格对王爽老师提什么希望的哦!希望楼主把自己的问题认真解决完,不要自己需要什么就给别人提什么希望,要清楚,楼主现在的水平是没有话语权的。
realbit
[第2楼]   [ 回复时间:2011-12-02 17:08 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第1楼]
------------------
你并没有明白我的意思。实际上计算机还是会把它当做负数。如果计算机把它当作正数计算,岂不是与我们的逻辑想
违背?

在高级语言里,死循环是存在的,汇编也不例外。
当其实不是真正的死循环。

比如这个程序:
assume cs:code

        code segment

          start:mov ax,0
                
                mov cx,-1
              s:inc ax
                loop s

                mov ax,4c00h
                int 21h
                
        code ends

end start

用ax计算循环的次数,最终结果是:

AX=FFFF  BX=0000  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B43  ES=0B43  SS=0B53  CS=0B53  IP=0009   NV UP EI NG NZ NA PE NC
0B53:0009 B8004C        MOV     AX,4C00

说明最终是跳出了,因为溢出后它又恢复正常了。

再说明一点,我并没有说王爽老师的书在这一章有什么错误,我只是希望王爽老师补充点内容而已。
chinatree
[第3楼]   [ 回复时间:2011-12-02 17:21 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
首先,你也知道溢出,但是你这个实验理过溢出吗?
 mov cx,0 
              s:inc ax 
                loop s
如果这个样子,会循环65536次,在第32768发生溢出,说明后面的结果是不准确的,但是你没理,那就是当做无符号数来计算.直到又为0.只是说,计算机在运算时,是做两种运算,一种是有符号数,一种是无符号数.如果你是认为做的是有符号数,就根据of等进行判断,如果是无符号数你就根据cf,af等符号位来判断.也就是说什么数在计算机那是没有区别的,区别的是你的心.
tomato
[第4楼]   [ 回复时间:2011-12-02 23:51 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
是进位了,不是溢出。我们可以不考虑正数还是负数,计算机执行loop指令的时候进行的是减一运算,如果减到零就终止循环。从这个上面去理解。
realbit
[第5楼]   [ 回复时间:2011-12-03 14:17 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
回复:[第4楼]
------------------
我又仔细看了一下,实际上是溢出了。

cx的变化

-1 ---> -32768 循环次数: 32767次
-32768 ---> 32767 此处溢出,循环次数: 1次
32767 --->0 循环次数: 32767次
总共计循环次数:32767+1+32767=65535次

我们将ax看作无符号整数:65535=FFFFh

所以说,在这个程序中,溢出是存在的。

“说明最终是跳出了,因为溢出后它又恢复正常了。”这句话的后半句是说,溢出后,在cx为正整数的情况下,loop才是正常的。
tomato
[第6楼]   [ 回复时间:2011-12-03 14:37 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
不明白楼上的意思。既然是无符号运算跟溢出都没有关系。根本就不用考虑是否溢出。
realbit
[第7楼]   [ 回复时间:2011-12-09 12:38 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:4
注册日期:2011-11-28 20:29
此贴由 贴主 于 [ 2011-12-09 12:38 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(tomato):2分   3楼(chinatree):8分   4楼(tomato):2分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved