首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASM中的PTR指令,它是如何工作的?

ASM中的PTR指令,它是如何工作的?
EN

Stack Overflow用户
提问于 2017-02-09 15:57:51
回答 2查看 2.1K关注 0票数 1

我有一个带有几个变量和一个指令的ASM代码块:

代码语言:javascript
运行
复制
.data
g BYTE 32h
a DWORD 11111111h
h BYTE 64h
.code
mov ebx, DWORD PTR g

有人能解释为什么ebx的值不是11 11 11 32而不是00 00 00 32,或者至少PTR是如何工作的?

我认为PTR指令会将操作数表示为32位操作数?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 17:58:36

如果您的代码看起来真的像您发布的内容,请参见@Jester的评论。

但从您的问题判断,我猜您的代码实际上包含了这一行:

代码语言:javascript
运行
复制
mov ebx, DWORD PTR g

我认为PTR指令会将操作数表示为32位操作数?

这取决于你的意思。当大小不明确时,DWORD PTR将用作大小说明符。

例如,指令mov [eax], 0将是模棱两可的,因为汇编程序不知道您是否打算编写一个字节、一个单词、一个dword等等。因此,在这种情况下,您可以使用DWORD PTR来声明您想要将一个DWORD写到内存:mov DWORD PTR [eax], 0

如果要从内存中读取字节并将其转换为DWORD,则需要使用movzxmovsx

代码语言:javascript
运行
复制
movzx ebx, BYTE PTR g   ; if g should be treated as unsigned
movsx ebx, BYTE PTR g   ; if g should be treated as signed
票数 0
EN

Stack Overflow用户

发布于 2017-02-09 19:13:05

不幸的是,x86的汇编语言过于通用,使用

代码语言:javascript
运行
复制
mov ebx,a

如果您查看指令编码(如果您正在编写/学习程序集,那么无论如何您应该有一个方便且打开的引用),您会发现这可能意味着在地址8处读取一个字节,或者在地址a处读取一个16位字,或者在地址a处有一个32位字。它可能会或不会更进一步,允许符号扩展与否。所以,为了得到你想要的正确的指令,你需要增加更多的东西。

汇编语言不是某种标准,它是由汇编程序定义的,程序读取ASCII文件,所以同一指令集的一种汇编语言并不规定另一种汇编语言是什么。尤其是x86,首先是英特尔对AT&T,然后是gcc对masm对nasm等等。当然,对于gcc和AT&T,以及其他有意不想与已经存在的内容相一致的人,你如何指定这是字节读,读字还是读dword,这是不同的。同样,如果没有指定所需内容,则生成默认指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42141282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档