assembly 'TYPE'但在NASM中

lo8azlld  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(171)

我知道在MASM中有SIZEOFTYPE,但是NASM呢?正如我发现的,它没有这些。
例如:

array   dw 1d, 2d, 3d, 4d
arrSize db $-array         ;4 elements * 2 bytes (size of one element) = 8 bytes

这就是我如何在NASM中对SIZEOF array进行替换。如果我想要数组元素的数量,我可以将 arrSize 除以2(如果数组元素是字)。但如果数组元素是双字(32位),我需要除以4。
在NASM中有没有来自MASM的TYPE的替代品?如果没有,我如何让程序确定元素本身的大小?

imzjd6km

imzjd6km1#

NASM保持其指令简单,并具有最少的自动化功能。
它似乎不是MASM typesizeoflength运算符的对应指令。
幸运的是,NASM采取了一种比在汇编中引入大量类型更好的方法:它开发了一个非常丰富和富有表现力的宏系统。
请考虑以下简单的宏:

;array <label>, <item directive>, <items>
%macro array 4-*
    %1: %2 %{3}                         ;label: db/dw/dd/... <firstItem>    
    %%second: %2 %{4:-1}                ;Local label (to get item size) and rest of the items
    
    %1_size EQU $ - %1                  ;Size of the array in bytes (here - label)
    %1_type EQU %%second - %1           ;Size of an item in bytes (second - label)
    %1_lengthof EQU %1_size / %1_type   ;Number of items (size of array /  size of item)
%endmacro

你可以像array my_array, dd, 1, 2, 3一样使用它。不完全像my_array dd 1, 2, 3,但很接近。
然后,您可以:

  • my_array_size。数组的大小(以字节为单位)。
  • my_array_type。一个数组项的大小(以字节为单位)。
  • my_array_lengthof。数组中的项目数。

您可以调整宏,使其适合您的个人风格(例如:生成my_array.size和类似的,或者生成隐式地采用项声明指令的arrdbarrdwarrdd变体)。
示例:

BITS 32

;array <label>, <item directive>, <items>
%macro array 4-*
    %1: %2 %{3}             ;label: db/dw/dd/... <firstItem>    
    %%second: %2 %{4:-1}            ;Local label, to get item size
    
    %1_size EQU $ - %1          ;Size of the array in bytes (here - label)
    %1_type EQU %%second - %1       ;Size of an item in bytes (second - label)
    %1_lengthof EQU %1_size / %1_type   ;Number of items (size of array /  size of item)
%endmacro

;To test, use ndisam -b32
mov eax, my_array_size
mov eax, my_array_type
mov eax, my_array_lengthof
mov eax, DWORD [my_array]

;The array (ignore on output from ndisasm)
array my_array, dd, 1, 2, 3

对生成的二进制文件使用ndisam -b32

00000000  B80C000000        mov eax,0xc
00000005  B804000000        mov eax,0x4
0000000A  B803000000        mov eax,0x3
0000000F  A114000000        mov eax,[0x14]
00000014  <REDACTED GARBAGE>

相关问题