- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在栈上初始化一个本地结构。
Records STRUCT
data1 DWORD ?
data2 DWORD ?
data3 DWORD ?
data4 DWORD ?
Records ENDS
.CODE
main:
mov ebp, esp
sub esp, SIZEOF Records
如何创建一个 struct Records
的命名实例,然后我可以用它来初始化数据成员?我想将 struct
指令与点运算符一起使用,而不是指针添加。
我开始是为结构体分配空间,那我该怎么办?
最佳答案
我会使用 PROC
指令的强大功能来定义函数1,并使用 LOCAL
指令在函数中分配变量。汇编程序将处理序言和结尾代码,您可以将类型与本地相关联。
您可以编写如下所示的函数:
main PROC
LOCAL rec1: Records
mov rec1.data1, 1
mov rec1.data2, 2
mov rec1.data3, 3
mov rec1.data4, 4
ret
main ENDP
代码将在堆栈上为名为 rec1
的变量分配空间,其余行用值 1、2、3、4 初始化结构字段。生成的汇编代码类似于:
Segment: _TEXT DWORD USE32 00000033 bytes
0000 _main:
0000 55 push ebp
0001 8B EC mov ebp,esp
0003 83 EC 10 sub esp,0x00000010
0006 C7 45 F0 01 00 00 00 mov dword ptr -0x10[ebp],0x00000001
000D C7 45 F4 02 00 00 00 mov dword ptr -0xc[ebp],0x00000002
0014 C7 45 F8 03 00 00 00 mov dword ptr -0x8[ebp],0x00000003
001B C7 45 FC 04 00 00 00 mov dword ptr -0x4[ebp],0x00000004
0022 C9 leave
0023 C3 ret
汇编器创建了一个堆栈帧并为您计算了堆栈上相对于 EBP 的所有偏移量。如果您想将 rec1
的地址放入寄存器并将其作为结构使用,您可以使用 LEA
获取堆栈上变量的有效地址并使用ASSUME
对其应用指针类型:
main PROC
LOCAL rec1: Records
lea eax, [rec1]
ASSUME eax: ptr Records
mov [eax].data1, 1
mov [eax].data2, 2
mov [eax].data3, 3
mov [eax].data4, 4
ret
main ENDP
生成的汇编代码为:
Segment: _TEXT DWORD USE32 00000035 bytes
0000 _main:
0000 55 push ebp
0001 8B EC mov ebp,esp
0003 83 EC 10 sub esp,0x00000010
0006 8D 45 F0 lea eax,-0x10[ebp]
0009 C7 00 01 00 00 00 mov dword ptr [eax],0x00000001
000F C7 40 04 02 00 00 00 mov dword ptr 0x4[eax],0x00000002
0016 C7 40 08 03 00 00 00 mov dword ptr 0x8[eax],0x00000003
001D C7 40 0C 04 00 00 00 mov dword ptr 0xc[eax],0x00000004
0024 C9 leave
0025 C3 ret
您也可以使用 LOCAL
指令来创建类型数组。然后您可以初始化数组中各个记录的元素。此示例在堆栈上为名为 rec1
的 4 个 Records
数组分配空间,并初始化第三个元素(数组索引 2,因为数组元素编号从零开始):
main PROC
LOCAL rec1[4]: Records
; Compute address of third Record structure in array
lea eax, [rec1]
ASSUME eax: ptr Records
add eax, 2*(SIZEOF Records)
; Initialize the the third Record structure
mov [eax].data1, 1
mov [eax].data2, 2
mov [eax].data3, 3
mov [eax].data4, 4
ret
main ENDP
生成的汇编代码为:
Segment: _TEXT DWORD USE32 00000038 bytes
0000 _main:
0000 55 push ebp
0001 8B EC mov ebp,esp
0003 83 EC 40 sub esp,0x00000040
0006 8D 45 C0 lea eax,-0x40[ebp]
0009 83 C0 20 add eax,0x00000020
000C C7 00 01 00 00 00 mov dword ptr [eax],0x00000001
0012 C7 40 04 02 00 00 00 mov dword ptr 0x4[eax],0x00000002
0019 C7 40 08 03 00 00 00 mov dword ptr 0x8[eax],0x00000003
0020 C7 40 0C 04 00 00 00 mov dword ptr 0xc[eax],0x00000004
0027 C9 leave
0028 C3 ret
我将 LEA
和 ADD
分成单独的指令,以更好地说明正在发生的事情。可以通过删除 ADD
并使用 LEA
将偏移量直接添加到 rec1
数组的基指针来简化。最好是这样写:
lea eax, [rec1 + 2*(SIZEOF Records)]
ASSUME eax: ptr Records
如果您在全局范围内创建结构(而不是堆栈上的本地结构),您可以这样声明和初始化它们:
.DATA
rec2 Records <1,2,3,4>
结构中的每个字段都用逗号分隔。该结构将出现在 _DATA
段中,如下所示:
Segment: _DATA DWORD USE32 00000010 bytes
0000 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 ................
数据以字节为单位打印。每个单独的 DWORD 以 LSB(最低有效字节)到 MSB(最高有效字节)出现。如果显示为 DWORD,它们将显示为
0000 00000001 00000002 00000003 00000004
1我在汇编文件的顶部使用了一个 .MODEL
指令来默认采用 C 风格的调用约定:
.386
.model flat, C
关于assembly - 如何在 MASM 程序集中初始化本地结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506869/
我正在将一个函数从内联汇编移植到 Visual Studio 2013 中的 MASM,并且无法从中获取返回值。 这是 C 调用者和汇编函数原型(prototype): extern "C" void
.model tiny .code org 100h host: mov ah,9 mov dx,offset hi int 21h mov ax,4c00h
我是一个初学者在大会。我试图实现一个函数,找到最大的数组,但得到一个错误:致命错误A1008:不匹配的宏嵌套。你能告诉我我做错了什么吗?
我是汇编方面的初学者。我正在尝试实现一个在数组中查找最大值的函数,但得到一个错误:致命错误A1008:不匹配的宏嵌套。你能告诉我我做错了什么吗?
我被指示用汇编编写一个程序,该程序将执行以下算术运算: ((A + B)/C) * ((D - A) + E) 当没有负值发挥作用时,我已经成功地做到了这一点,但假设 A = 5、B = 4、C =
我决定自学汇编语言。 我已经意识到,如果我尝试更改任何段寄存器的值,我的程序将无法编译。 我发现的每篇文章都说我确实可以更改至少 4 个段寄存器的值,那是什么? 我真的只对为什么此时感兴趣,我没有任何
在保护模式下调用内存地址低于当前函数的函数时,我遇到异常。异常会根据代码配置而有所不同,有时是一般保护故障,有时是无效的操作码等。 这里是一个程序的源代码,该程序在硬件上产生一般保护错误,在 DOSB
我是 assembly 初学者。我正在尝试使用 MASM 在屏幕上打印一封信。我定义了堆栈段,但是当我尝试链接程序时,收到此警告: 链接:警告 L4021:没有堆栈段 但是该程序运行良好!我怎样才能解
我正在尝试查询 FS 段寄存器指向的进程环境 block 中的值。尝试编译包含 fs:[0] 段的代码会导致错误(错误 A2108:使用寄存器假定为错误)。 如何查询段寄存器?! 谢谢 最佳答案 MA
我有一些在x86上进行汇编的示例代码,使用的是我想学习的MASM,但是我很难理解。以下是以下数据段: .data sNum1 word 23,-17 iX dword
我一直在使用 MASM 再次涉足 x86 程序集,但遇到了一个小障碍。希望从纯粹的享受中重新发明轮子。 ASSUME eax:PTR hostent mov ebx, [eax].h_
我正在运行一个程序,要求用户输入要显示的合数的个数。前任。如果用户输入 10,程序将显示前 10 个合数。 我遇到的问题是我的程序在一长列中打印所有值,我需要让输出显示为每行 10 个合数,它们之间至
这是我的第一个问题,希望您能帮助我!我目前正在开发 GameBoy 模拟器并想用 MASM 编写它,为了处理CPU指令,我想创建一个包含变量的数组,以便于访问。 这是我想要实现的示例: assume
我需要从汇编代码中调用将三个整数相加 3 的函数;整数本身在 assembly 部分中设置; 一切看起来都正确,但 masm 函数似乎没有返回正确的值。它存储在 eax 中,应该作为函数值返回,但是在
我在哪里可以找到详细说明 MASM 完整指令集的链接或文档的好站点? 为了提供上下文,我目前正在 VS2008 中处理一个 C++ 项目,并且我已经达到了了解程序集到底在说什么(对于添加上下文)很有用
对汇编还很陌生,玩得很开心。我想将我的程序的功能拆分到多个文件中,特别是通过将相似的功能组合在一起进行组织。这些其他文件将由主文件调用(希望甚至是其他非主文件)。我还没有设法做到这一点,希望得到帮助。
在8086处理器中,我们使用的ic是不同的......我认为它们是16位的......但我们在64位计算机上练习代码......这怎么可能?请解释>>>> MaSm实际上是什么? ?你能解释一下我在哪
我正在尝试用 x86 汇编语言编写一个接受三个参数的函数。是否可以用 MASM 汇编语言定义一个具有多个参数的函数? //this is pseudocode: I'm trying to conve
NASM 和 MASM 汇编器之间的语法差异是什么? 最佳答案 NASM 文档第 2.2 节的标题为 Quick Start for MASM Users其中列出了 NASM 和 MASM 之间的重要
我要编写一个宏,它采用 E,NE,A,B... 作为参数和单个命令,即 mov eax,ebx ,这将如果前面的 cmp 操作设置的条件为真,则执行。 调用示例如下所示。 cmp bx,20 mDoI
我是一名优秀的程序员,十分优秀!