游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4739|回复: 13

请问一下~有关内嵌汇编

[复制链接]

34

主题

297

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
QQ
发表于 2004-2-18 15:25:00 | 显示全部楼层 |阅读模式
请问该怎样用一条语句将一个WORD值赋给一个32位寄存器的高16位呢?
低16位的话可以直接mov
比如
WORD Sour;
_asm
{
    mov ax,Sour
}
请问高16位应该怎样表示?

谢谢了~ [em5]

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-2-18 15:59:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

好像是没有这样的指令可用吧。你可以:
1。让电脑去掉一个错误答案。
2。电话求助。。
3。求助现场的朋友。。。。。。。。。。。。。。

把一个WORD读入32位的REG的高16位,INTEL并没有提供相应的指令,也可以有一些办法做到这点:
1。先读入低位,再进行移位

2。将WORD并入一个DWORD来读取,地址靠后的WORD自然就在高位里了(有可能因为数据未对齐导致错误)

第一种方法使用方便但效率不高
第二种方法对数据有比较严格的要求

34

主题

297

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
QQ
 楼主| 发表于 2004-2-18 16:21:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

偶现在很少看综艺节目了……

把两个WORD并成一个DWORD?
能告诉我该怎么做么?
谢谢了~

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-2-18 16:41:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

举个例子
有数组 szChar a[4],有szChar[0],szChar[1].....四个元素组成,它们在内存中按线性顺序存放。即:
假设:
地址           char型数组           WORD 16Bit            DWORD 32Bit
0004          szChar a[0]          WORD1_LO_8          DWORD1_LO_16
0005          szChar a[1]          WORD1_HI_8
0006          szChar a[2]          WORD2_LO_8          DWORD1_HI_16
0007          szChar a[3]          WORD2_HI_8

一个32位数据在使用INTEL的CPU上在内存中是这样表示的,即低位在低地址,高位在高地址。
所以要把一个WORD并入DWORD中读取的意思就是说要读入两个WORD,并使得需要放入REG高位的WORD在高地址上,即:

mov eax,address 中的address为WORD的地址再减掉一个WORD的SIZE。这样读一个DWORD,WORD自然就到高位了。

34

主题

297

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
QQ
 楼主| 发表于 2004-2-18 17:07:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

太感谢了~
hm
多次接受你的帮助~谢谢

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-2-20 00:15:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

我觉得你的理解可能有偏差,正常来讲,你可以将高十六位放入 cx 寄存器中,如:
__asm{
  mov ax, loword
  mov dx, hiword
}
不清楚你要为何放将高十六位放入 eax 中。在 80286 之前,模拟 32 存储 32 位数据就是使用两个十六位寄存器。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-2-20 00:39:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

另外, hmhm ,你的方法不行, mov 指令要求操作数必须一致,即同时为字,或字节,不能一个双字,另一个是字。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-2-20 00:42:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

如果非要传送到高位,不如直接这样:

DWORD dw = 0x9c000000h;
__asm{
  mov eax, dw
}

这样高位自然就是你要传送的内容了。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2004-2-20 06:23:00 | 显示全部楼层

Re: Re:请问一下~有关内嵌汇编

congy: Re:请问一下~有关内嵌汇编

另外, hmhm ,你的方法不行, mov 指令要求操作数必须一致,即同时为字,或字节,不能一个双字,另一个是字。


你去做过了吗?不要在这里想当然。
还有,使用EAX,当然是读入一个32位的数据,在x86上来说就是一个DWORD

34

主题

297

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
QQ
 楼主| 发表于 2004-2-20 08:45:00 | 显示全部楼层

Re:请问一下~有关内嵌汇编

我之所以要把WORD值放在32位寄存器的高16位是为了改进自己的alpha函数,现在的版本是这样(565):
inline Alpha_asm(WORD Sour,WORD Dest,int alpha)
{       
        _asm
        {
               
                mov ax,Sour;
                sal eax,16;
                mov ax,Sour;
                mov di,Dest;
                sal edi,16;
                mov di,Dest;
                and eax,0x07e0f81f;
                and edi,0x07e0f81f;
                mov ecx,alpha;
                mul ecx;
                mov ebx,eax;
                mov eax,edi;
                neg ecx;
                add ecx,32;
                mul ecx;
                add eax,ebx;
                shr eax,5;
                and eax,0x07e0f81f;
                mov ebx,eax;
                shr ebx,16;
                or eax,ebx;
                mov Dest,ax;
        }
        return Dest;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 10:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表