. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  由第11章检测题 第3题引出的思考:怎么判断计算机进行的是有符号数运算还是无符号数运算?  [待解决] 回复[ 20次 ]   点击[ 1131次 ]  
lcf20092009
[帖 主]   [ 发表时间:2010-01-19 21:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-06 09:36
sub ax,ax
mov ax,5
add ax,-3
以上程序执行完后,CF、OF的值是   
A、0,0  B、0,1   C、1,0    D、1,1


分析:因为-3的补码为1101    而13的补码也为1101
此题可以明显看出是有符号运算,所以程序执行后。CF=0  OF=1

所以此题如果改成如下:

sub ax,ax
mov ax,5
add ax,1101B
则以上程序执行完后,CF、OF的值是  


请问该如何判断CF与OF的值。如何知道是有符号数运算还是无符号数运算。
求高人指点。
scuzg
[第1楼]   [ 回复时间:2010-01-20 21:49 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
一个数是不是带符号数取决于程序员对参与运算的数最高位的使用:认为参与运算的数的最高位是符号位,则是带符号数;认为参与运算的数的最高位是有效数位,则是无符号数。
    其实计算机在进行加减运算时是不知道所处理的数是带符号数还是无符号数;计算机在进行加减运算时,是将运算结果作为带符号数和无符号数对符号位的影响都“罗列”出来,供编程者选用。我们也以楼主的题为例:
sub ax,ax           ;顺便说,这句是没有意义的,因为下面一句将 ax 赋值为 5 和 ax 是否为 0 无关;
mov ax,5 
add ax,-3 
以上程序执行完后,CF、OF的值是    
A、0,0  B、0,1   C、1,0    D、1,1 
   我们先分析 of。of = 1 表示“带符号数”溢出。什么是带符号数溢出?两个正数相加最为直观:数值部分向符号位进位既为溢出。上述是两个异号数相加,完全没有溢出的可能,因此 of = 0。
   再说 cf。cf 将记录运算结果的最高位向外的进位。这就是一个单纯的二进制运算,我们把 5 和 -3 展开,这里需要说明的是,ax 是16位寄存器,所以是两个16位二进制数相加;为了看着方便,我们4位一组分开写
 5=0000 0000 0000 0101
-3=1111 1111 1111 1101 (补码)
不难看出,两数相加向外进位是显然的。其实计算机的行为和我们刚才的过程一样,将两数作为带符号数和无符号数相加对符号位的影响都“罗列”出来,供后续代码选用。
   可能有朋友会说,代码中明明写的是 -3 ,这不是带符号数是什么?其实这只是给人看的,经编译后 -3 变成了1111 1111 1111 1101,这也可以看作是无符号数 65533。
bigbigwolf
[第2楼]   [ 回复时间:2010-01-28 10:23 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-01-13 10:56
学习了。
qiangzi
[第3楼]   [ 回复时间:2010-01-29 22:27 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
回复:[第1楼]
------------------
其实计算机在进行加减运算时是不知道所处理的数是带符号数还是无符号数;计算机在进行加减运算时,是将运算结果作为带符号数和无符号数对符号位的影响都“罗列”出来,供编程者选用。
请教一下一楼:
在我们判断zf,sf的时候是不是根据有符号数来判断的,那么判读pf的时候呢?
scuzg
[第4楼]   [ 回复时间:2010-01-30 13:42 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
使用 sf 及 of 标志,说明程序(编程者)把处理结果视为带符号数;
zf 及 pf 和被处理的数是否为带符号数无关。
qiangzi
[第5楼]   [ 回复时间:2010-01-30 19:09 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
回复:[第4楼]
------------------
那比如执行
sub ax,ax
mov ax,5
add ax,-3
楼上说与是否为带符号数无关,那么怎么判断zf,pf呢,那是把它们当做有符号数,还是无符号数来计算呢?
好像有点钻牛角尖,不过真的不是很懂~~
scuzg
[第6楼]   [ 回复时间:2010-01-30 19:48 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
坚持是正常的,放弃意味着真正的失败!支持楼上。
① 再次说明楼上所述代码的第一句:
        sub ax,ax
是没有意义的,因为下面一句将 ax 赋值为 5 和之前 ax 是否为 0 无关。
② 再说 add ax,-3 经编译后,源操作数把编译成 -3 的补码 65533,等到执行该语句时,计算机不知道这数字是无符号数 65533 还是 -3 的补码,仅直接按无符号二进制数的加法规则运算即可。计算结果是:
(AX)=2,CF=1
从无符号数的角度看,结果是65536(进位)+ 2 = 65538;
从带符号数的角度看,结果是 5 + (-3) = 2
③ zf 和 pf 的判断
    带符号数和无符号数相等或运算结果为零都是 zf = 1,ax 的内容为 2 ,那么容易得出 zf = 0;
    pf 用于标志运算结果的低 8 位 1 的个数,这显然和是不是带符号数没有关系,直接数运算结果低 8 位中 1 的个数即可。由于楼上所述代码的运算结果是存放在 ax 中的,所以仅需数一数 al 中 1 的个数是双数还是单数就行了。不难得到 al 中 1 的个数是奇数,所以 pf = 0.
qiangzi
[第7楼]   [ 回复时间:2010-01-30 20:56 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:6
注册日期:2010-01-07 10:37
谢谢scuzg,这次明白了~~~
lcf20092009
[第8楼]   [ 回复时间:2010-01-30 21:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-06 09:36
本人的理解同qiangzi 的理解一样。如下:

回复:[第1楼] 
------------------ 
其实计算机在进行加减运算时是不知道所处理的数是带符号数还是无符号数;计算机在进行加减运算时,是将运算结果作为带符号数和无符号数对符号位的影响都“罗列”出来,供编程者选用。 

关键点在于大家对OF 与CF的理解上。OF是指结果是否超出范围,而CF是看是否有进位。希望能对大家有所帮助。其它几个位都好理解了。
thedaydreamwang
[第9楼]   [ 回复时间:2010-02-10 00:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
又看见scuzg老题的讲解了比王爽老题的教程讲的细一些,初看到这里的时候经常被“误导“现在总算是知道真相了!!理论还是很重要的!!!再次佩服一下!!
thedaydreamwang
[第10楼]   [ 回复时间:2010-02-10 07:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
assume cs:code
 code segment
     start: mov ax,1
             mov bx,3
             mov al,8
             mov bl,-200  ;大家可以把这里的-200改成56试试结果
             add al,bl
             mov ax,4c00h
             int 21h
  code ends
   end start
先来看看补码数抽的概念
1000000000000001
1000000000000000
0111111111111111
0000000000000111   ;7
0000000000000110   ;6
0000000000000101   ;5
0000000000000100   ;4
0000000000000011   ;3
0000000000000010   ;2
0000000000000001   ;1
0000000000000000   ;这里为0
1111111111111111   ;-1
1111111111111110   ;-2
1111111111111101   ;-3
1111111111111100   ;-4
1111111111111011   ;-5
1111111111111010   ;-6
1111111111111001   ;-7
1111111111111000   ;-8
1111111111110111   ;-9
1111111111110110   ;-10
1111111111110101   ;-11
1000000000000000
再往下就是
0111111111111111了
本来该十钟是指向12点的现在al为8所以它正着走了8下然后又倒阗走了200下结果和正着走56下是指向的同一个位置!!!
大家注意这条数轴有两个方向的你希望它怎么走都能表示数(它只是个工具因为是八位运算所以表示范围-127到128)有点像十钟


脑子里应该有数轴的概念了吧!!上面是十六进制的补码数轴(我们认为该十钟能表示的数的范围为-32768到32767)
下面在看看debug32中的情况
注意-200和56的补码是一样的(再次论证)
AX=0001  BX=0000  CX=0011  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=0003  NV UP DI PL NZ NA PO NC
2196:0003 BB0300           MOV     BX,0003h
Trace Interrupt
-t
AX=0001  BX=0003  CX=0011  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=0006  NV UP DI PL NZ NA PO NC
2196:0006 B008             MOV     AL,08h
Trace Interrupt
-t
AX=0008  BX=0003  CX=0011  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=0008  NV UP DI PL NZ NA PO NC
2196:0008 B338             MOV     BL,38h
Trace Interrupt
-t
AX=0008  BX=0038  CX=0011  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=000A  NV UP DI PL NZ NA PO NC
2196:000A 02C3             ADD     AL,BL
Trace Interrupt
-t
AX=0040  BX=0038  CX=0011  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=2186  ES=2186  SS=2196  CS=2196  IP=000C  NV UP DI PL NZ AC PO NC
2196:000C B8004C           MOV     AX,4C00h                         ( 大家注意上面这里变成了AC)
Trace Interrupt
-


-200被转成了56     十六进制数为38你把十钟倒着数200下和正着数56是指向的同一个位置(呵呵有点意思了吧!!)
以上部分可以说是被编译器处理过了!!
注意10000000后面是
      01111111  -128 和127的补码一样
所以-200实际上和56的补码一样
在这个过程我们认为它是有符号的所以
呵呵所以。。。。。。55555不知道怎么理解了!!!反正就是都罗列出来了吧!!你可以认为它进行了两种不同的运算
现在还不能定位它到底是何种运算所以要看sf的值了和cf的值了,
搞手教!!
thedaydreamwang
[第11楼]   [ 回复时间:2010-02-10 07:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
再怎么理解呢本来是正着走的现在又倒着走的所以sf发了改变原因就是说话的立场发生改变所以结果为-192
thedaydreamwang
[第12楼]   [ 回复时间:2010-02-10 07:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
正着走就是56下就是64倒着走200下就是-192
thedaydreamwang
[第13楼]   [ 回复时间:2010-02-10 07:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
中间有个过程被忽视了还要看你倒着走的数大不大于128为这时钟只能表示256个数字,我想这里就是所谓的益出吧OF是否发生改变
再总结一下
你是先 正着走 再正着走
       倒着走 倒着走
       正着走  倒着走
       倒着走  正着走
分为四种情况!!!再后面的高手指教!!
thedaydreamwang
[第14楼]   [ 回复时间:2010-02-10 07:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
我的意思是它先正着走CF=0然后倒着走了-200下大于128所以。。。。大家再总结一下吧!!
thedaydreamwang
[第15楼]   [ 回复时间:2010-02-12 20:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18
今天又来看了一下scuzg老题的回答,总算是真正明白其中的含义了,前两天的胡乱猜想还是没有成功!!!因为不能圆其说,后来才明白原来是自已还没有搞清楚题目的意思,王爽老题的教程的第一句话就已经告诉我们答案了,什么是标志位的问题,sf是表示的一种状态,cf也是,of也是你可以理解为几个不同的寄存器,他们之间并没有太多的关系,它们都可以表示数据被外理的一种结果,也就是scuzg老题所说的罗列吧!!!明白这点就好了!!剩下的工作就好做了!!
driftsand
[第16楼]   [ 回复时间:2013-03-20 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-17 10:42
坚持是正常的,放弃意味着真正的失败!支持楼上。
① 再次说明楼上所述代码的第一句:
        sub ax,ax
是没有意义的,因为下面一句将 ax 赋值为 5 和之前 ax 是否为 0 无关。
② 再说 add ax,-3 经编译后,源操作数把编译成 -3 的补码 65533,等到执行该语句时,计算机不知道这数字是无符号数 65533 还是 -3 的补码,仅直接按无符号二进制数的加法规则运算即可。计算结果是:
(AX)=2,CF=1
从无符号数的角度看,结果是65536(进位)+ 2 = 65538;
从带符号数的角度看,结果是 5 + (-3) = 2
③ zf 和 pf 的判断
    带符号数和无符号数相等或运算结果为零都是 zf = 1,ax 的内容为 2 ,那么容易得出 zf = 0;
    pf 用于标志运算结果的低 8 位 1 的个数,这显然和是不是带符号数没有关系,直接数运算结果低 8 位中 1 的个数即可。由于楼上所述代码的运算结果是存放在 ax 中的,所以仅需数一数 al 中 1 的个数是双数还是单数就行了。不难得到 al 中 1 的个数是奇数,所以 pf = 0.
------------------
回复:sub ax,ax这句并不是没有意义,意义是将CF和OF先置为0。
guozai
[第17楼]   [ 回复时间:2013-07-15 16:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-04-25 14:48
坚持是正常的,放弃意味着真正的失败!支持楼上。
① 再次说明楼上所述代码的第一句:
        sub ax,ax
是没有意义的,因为下面一句将 ax 赋值为 5 和之前 ax 是否为 0 无关。www.sy690.com
② 再说 add ax,-3 经编译后,源操作数把编译成 -3 的补码 65533,等到执行该语句时,计算机不知道这数字是无符号数 65533 还是 -3 的补码,仅直接按无符号二进制数的加法规则运算即可。计算结果是:
(AX)=2,CF=1
从无符号数的角度看,结果是65536(进位)+ 2 = 65538;
从带符号数的角度看,结果是 5 + (-3) = 2
③ zf 和 pf 的判断www.sanalync.com
    带符号数和无符号数相等或运算结果为零都是 zf = 1,ax 的内容为 2 ,那么容易得出 zf = 0;
    pf 用于标志运算结果的低 8 位 1 的个数,这显然和是不是带符号数没有关系,直接数运算结果低 8 位中 1 的个数即可。由于楼上所述代码的运算结果是存放在 ax 中的,所以仅需数一数 al 中 1 的个数是双数还是单数就行了。不难得到 al 中 1 的个数是奇数,所以 pf = 0.
------------------
回复:sub ax,ax这句并不是没有意义,意义是将CF和OF先置为0。
------------------
回复:不错
jayh
[第18楼]   [ 回复时间:2014-11-16 11:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-11-08 22:37
这个问题很简单啊,书上也很明白的写了。
在第二版的218页,介绍OF标志位时:“CPU在执行add等指令时候,就包含了两种含义:无符号数运算和有符号数运算。。。。CF位记录是否产生进位,OF记录是否产生溢出。。”
就你的例子
sub ax,ax 
mov ax,5 
add ax,-3
这么来确定CF和OF:
对于CF 你这里的-3可以表示成0F.Dh,加5以后就会大于最大无符号数,所以CF =1
对于OF,5-3=2,这里的2没有超出有符号数表示范围,ax存储这个值不会有溢出的(为什么呢?65536/2-1>2>-65536/2).

再不能确定,你可以用debug调试一下,看是否有NC->CY(CF=1),PL->NG(OF=1).
zhaolihua_314
[第19楼]   [ 回复时间:2014-12-18 18:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-12-16 18:24
由sf决定,
dasa
[第20楼]   [ 回复时间:2017-07-20 09:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-07-20 09:18
回复:[第10楼]
------------------
有没有搞错,mov bl,-200也行,作为有符号的范围是-127至128,-200显然装不下
应该mov bx,-200,见bx的值bx=1111111100111000b,那么很明显-200与56是不一样的
56=0000000000111000b.
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved