palm008 发表于 2014-04-22 11:19

shll $16,%dx 是什么意思

shll $16,%dx 指令是什么意思,网上说:把dx移到edx的高16位, 这个指令中根本没有出现edx寄存器,这该怎么理解

humjb_1983 发表于 2014-04-22 12:37

shll k,D
D = D << k
左移(同sall)

palm008 发表于 2014-04-22 13:20

回复 2# humjb_1983

dx为8位寄存器,如果右移动16位后结果仍然放到dx中,dx恐怕不能放下移位后的结果

   

humjb_1983 发表于 2014-04-22 13:48

palm008 发表于 2014-04-22 13:20 static/image/common/back.gif
回复 2# humjb_1983

dx为8位寄存器,如果右移动16位后结果仍然放到dx中,dx恐怕不能放下移位后的结果

不对吧,dx是16位的寄存器,edx是32位的,dx中的数据左移16位后,存入的应该是edx寄存器。

palm008 发表于 2014-04-22 14:55

回复 4# humjb_1983
dx多少位,和具体的处理器有关,我的疑问是指令 shll $16,%dx移位后的结果放在那里,dx肯定是放不下结果了,如果是放在edx中,是什么原理呢?怎么不选择eax呢?


   

humjb_1983 发表于 2014-04-22 14:58

个人理解edx和dx实际物理上是同一个寄存器吧~,只是取的范围不同

palm008 发表于 2014-04-22 16:06

humjb_1983 发表于 2014-04-






l4rmbr 发表于 2014-04-22 16:52

本帖最后由 l4rmbr 于 2014-04-22 16:52 编辑

回复 1# palm008

这条指令哪里来的呢?

shll中的最后l要求参数应该是个字长,即%edx,否则会报错的。

比如:
/* test.c */
int main(void)
{
      __asm__("movw $ff00,%%dx\t\n"
                     "shll $16,%%dx\t\n"
                         :::);

      return 0;
}然后gcc test.c马上报错:

Error: incorrect register `%dx' used with `l' suffix


   

humjb_1983 发表于 2014-04-22 16:53

呵呵,这个有啥问题?正是说明同一个寄存器吧~

l4rmbr 发表于 2014-04-22 17:57

回复 9# humjb_1983

hmm,他想表达的意思没错吧。不过我怀疑那条指令通不过编译,所以想问问是哪来的。


   
页: [1]
查看完整版本: shll $16,%dx 是什么意思