-
问题内容:指令如何区分无符号数和有符号数?
- 原讨论链接: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)