CSDN=>FAQ=>FAQ 展示
  • 问题内容:指令如何区分无符号数和有符号数?
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5087309
  • 所属论坛:汇编语言     审核组:其他开发语言
  • 提问者:lazyfish     解决者:mydo
  • 感谢:microyzy DelphiGuy
  • 关键字:其他开发语言 汇编语言 符号 机器 指令 汇编 区分 mov 偏移 当成 ffh
  • 答案:

    机器指令如何区分如何区分无符号数和有符号数?比方说mov ax,[bx+FFh], bx+FFh到底对应的是哪个内存地址?假设bx = 200, bx+FFH到底是 199(200-1, FFh的补码是-1,此时当作符号数)还是455(200+255,此时当做无符号数)呢? 查了一下资料,说有符号数无符号数是自己说了算,可我还是没有弄明白,mov ax,[bx+FFh],到底是mov ax,[199]还是mov ax,[455],这两种取值显然不同,机器指令怎么知道要从什么地方取值的?希望高人指点一下,不要BS俺 :)。
    ---------------------------------------------------------------

    很简单,看你前面的数的宽度,因为bx是双字节,所以ff要当作双字节数来看待,这样
    他就是正数因为 00ffh,如果要他形成负数效果可以:

    mov ax,[bx+0ffffh]

    这时后者就会被当成一个负数
    ---------------------------------------------------------------

    加法运算要求操作数长度相同,这里的0FFH应该有word prt的扩展吧
    按照mydo的说法,这个规定在intel的指令手册了应该有,我猜的:)
    ---------------------------------------------------------------

    mov ax,[bx+xx] 这种基址+偏移的指令一般有两种格式:
    8b 87 xx xx是16位偏移
    8b 47 xx是8位偏移
    至于汇编器生成哪种机器码取决于它怎样看待偏移,一般就是:如果你没写成负的,就当成正的。但是偏移肯定是有符号数,FFFF或者FF会被当成-1(这不是说你的mov ax,[bx+FFh]会被认为是mov ax,[bx-1],汇编器会优先把它当成16位值来尝试,如果此时偏移在-128~127之内,再改成8位偏移的机器码)。

  • 评价: 有价值 给朵鲜花(1) 无价值 扔个鸡蛋(2)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo