Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在x86程序集中按列显示数组_Assembly_X86_Irvine32_Masm32 - Fatal编程技术网

Assembly 如何在x86程序集中按列显示数组

Assembly 如何在x86程序集中按列显示数组,assembly,x86,irvine32,masm32,Assembly,X86,Irvine32,Masm32,我可以按行显示数组。我想了解如何按列显示数组 我在一个数组中创建了随机数 如何按列显示数组的内容 当前我的代码 .code push OFFSET array push count call disproc disproc PROC push ebp mov ebp, esp ... ... ... mov eax,[esi] call writedec add esi, 4 loop .... disproc ENDP 输出: 1 2 3 4 5 6 7 8 9 10 所需输出: 1

我可以按行显示数组。我想了解如何按列显示数组

我在一个数组中创建了随机数

如何按列显示数组的内容

当前我的代码

.code
push OFFSET array
push count
call disproc

disproc PROC
push ebp
mov  ebp, esp
...
...
...

mov eax,[esi]
call writedec
add esi, 4
loop
....
disproc ENDP
输出:

1 2 3 4 5
6 7 8 9 10
所需输出:

1 4 7 10
2 5 8
3 6 9

<>我应该考虑什么?

我不认为IrvNI32有光标移动函数。< /P> 因此,您只能从左到右,然后从上到下打印文本。或者,如果光标移动功能确实存在,则不必为此使用它们

解决方案是确定要在每一行上打印哪些数组元素,以便确定打印数组元素的顺序

假设数组是dd1,2,3,4,5,6,7,8,9,10,则打印的顺序是Fortran格式的列主顺序,而不是C格式的行主顺序

这意味着在一行中的元素上循环涉及按行数递增索引

您需要决定以某种方式使用多少行,可能是作为一个额外的函数arg。考虑到这一点,在数组中跨4*行字节以获得该行中的元素。您可以检测行的结尾,因为您的指针地址将>=array\u end。然后循环回到下一行的开头

例如:未经测试

为了方便起见,我使用了一个自定义的呼叫约定。它类似于fastcall,但具有第三个寄存器参数ESI


使用更少的寄存器可能是可能的,但我现在不知道如何使用。当然,我们可以在堆栈上保留一些只读的内容,而不会导致效率低下,但我们确实有足够的寄存器,即使是外部循环的内容。

我修复了您的标记;这不能是x86-64代码,因为push ebp在长模式下不可编码。
array_square_print PROC
;; array pointer passed in       ESI   (clobbered)
;; column length = # of rows  in ECX   (clobbered)
;; total element count in        EDX   (clobbered)
    push  ebx
    push  edi    ; save some call-preserved registers

    lea   edx, [esi + 4*edx]     ; endp = one past the end  = array + n*size
    lea   ebx, [ecx * 4]         ; row_stride in bytes
    mov   edi, esi               ; start point for this row

@row_loop:
 @col_loop:
     mov   eax, [esi]
     add   esi, ebx               ; p += row_stride
     call  writedec 

     cmp   esi, edx
     jb   @col_loop               ; }while(p<endp);

    add   edi, 4                  ; next row = advance down the column
    mov   esi, edi                ; p = rowstart

    dec   ecx
    jnz   @row_loop

    pop   edi     ; restore regs
    pop   ebx
    ret
array_square_print ENDP