masm32:简单的数组操作

发布于 2024-12-05 00:27:05 字数 323 浏览 1 评论 0原文

我有一个非常简单的问题:

我想将字节存储在masm32中的一维数组中(我昨天刚开始使用它,之前使用过c#),然后用一些简单的数学对其进行修改,但我没有在网上找到任何有用的东西。

tiles BYTE 12 dup (0) ; array of 12 bytes with value 0

这就是我在 .data 部分中声明数组的方式,基本上我想要在 C# 语法中执行的操作是:

for(int i = 0; i < tiles.Length; i++)
    tiles[i] += 2;

I have a very simple problem:

I want to store bytes in a 1d array in masm32 (I just started with it yesterday, used c# before), and then modify it with some simple math, but I didnt found anything useful in the net.

tiles BYTE 12 dup (0) ; array of 12 bytes with value 0

this is how i declare the array in the .data section, basically what I want to do in C# syntax is:

for(int i = 0; i < tiles.Length; i++)
    tiles[i] += 2;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

演多会厌 2024-12-12 00:27:05

我不记得 masm32 使用的确切指令,但基本结构应该是这样的:

    mov edi, addr tiles ; might be called offset, some assemblers (notably gas) would use something like lea edi, [tiles] instead
    mov ecx, 12 ; the count, this could be gotten from an equ, read from a variable etc.
for_loop:
    add byte ptr [edi], 2 ; tiles[i] += 2
    inc edi ; move to next tile
    dec ecx ; count--
    jnz for_loop ; if (count != 0) goto for_loop

或者如果您希望它的结构更像 c# 代码:

    mov edi, addr tiles
    sub ecx, ecx ; ecx = 0
for_loop:
    cmp ecx, 12 ; ecx < tiles.Length ?
    jnl done ; jump not less
    add byte ptr [edi+ecx], 2 ; tiles[i] += 2
    inc ecx ; i++
    jmp for_loop
done:

请注意,如果您更改 tiles 一些代码必须更改(特别是涉及 edi 的代码)。

I can't remember the exact directives masm32 uses, but the basic structure should be something like this:

    mov edi, addr tiles ; might be called offset, some assemblers (notably gas) would use something like lea edi, [tiles] instead
    mov ecx, 12 ; the count, this could be gotten from an equ, read from a variable etc.
for_loop:
    add byte ptr [edi], 2 ; tiles[i] += 2
    inc edi ; move to next tile
    dec ecx ; count--
    jnz for_loop ; if (count != 0) goto for_loop

Or if you want it to be structured more like the c# code:

    mov edi, addr tiles
    sub ecx, ecx ; ecx = 0
for_loop:
    cmp ecx, 12 ; ecx < tiles.Length ?
    jnl done ; jump not less
    add byte ptr [edi+ecx], 2 ; tiles[i] += 2
    inc ecx ; i++
    jmp for_loop
done:

Notice that if you change the type of tiles some of the code will have to change (the ones involving edi in particular).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文