ASM结构

1.标识符

1.c语言的标识符

img

char:1字节

int:4字节

double:8个字节

float:4个字节

2.汇编中的指令格式

image-20240725163919029

操作码 目的操作数 源操作数

1.数据传送指令:从源地址向目的地址传送数据

movsb ,movsw ,movsd

2.字节:字(2字节,双字(4字节)

byte、word、dword

3.解析:

变量赋值是使用mov指令的

其中char、int类型赋值都是直接使用mov指令将立即数存储到寄存器中

但是float和double类型进行赋值时,却使用了2次mov指令

解释:

在x86或x64架构的汇编语言中,浮点数(float和double)的赋值通常比整数类型的赋值复杂,因为它们使用不同的处理单元和寄存器集。整数通常使用通用寄存器,而浮点数使用浮点单元寄存器(如x87浮点堆栈)或SIMD寄存器(如SSE的XMM寄存器),并且它们的编码方式不同。

对于float和double类型的变量,比如使用SSE(Streaming SIMD Extensions)指令集的movss(move scalar single-precision floating-point value)和movsd(move scalar double-precision floating-point value)指令进行赋值。但仅仅使用一个movssmovsd指令可能不足以完成浮点数赋值的全部工作。这种情况往往需要分几个步骤完成:

  1. 将浮点数值从内存加载到浮点寄存器中(或者先将立即数加载到通用寄存器,然后转移到浮点寄存器里)
  2. 在需要的时候,可能还需将浮点数值从一个浮点寄存器传输到另一个浮点寄存器中进行操作(如数学运算等)

例如,一个变量赋值的汇编过程可能是:

mov     eax, DWORD PTR [value] ; 将内存中的值加载到通用寄存器eax
movss   xmm0, DWORD PTR [eax] ; 将eax寄存器中的值(float)移动到xmm0寄存器

或者对于double类型:

mov     rax, QWORD PTR [value] ; 将内存中的值加载到通用寄存器rax
movsd   xmm0, QWORD PTR [rax] ; 将rax寄存器中的值(double)移动到xmm0寄存器

这样的操作通常是为了遵守调用约定(传递参数给函数)或是为了对浮点数进行接下来的算术运算。如果在内存中某个地址直接赋值浮点数,就可能会看到类似这样的汇编代码:

mov     DWORD PTR [var], 0x4048F5C3 ; 将float变量赋值为3.14,立即数为3.14的IEEE 754表示

或者是double类型:

mov     QWORD PTR [var], 0x40091EB851EB851F ; 将double变量赋值为3.14,立即数为3.14的IEEE 754表示

这样直接赋值通常是为了初始化一个在内存中的浮点数变量,而不是准备将浮点数作为参数传递给函数或者是用于浮点运算。不过,具体的汇编语句取决于编译器的优化策略、处理器架构以及操作系统的调用约定

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇