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