程序需求:编程写一个完整的程序,将数组array中的元素按逆序存放,要求程序中附加的变量最少。数据段的定义如下:
.data
array dword 12,4, 168,122,-33,56,78,99,345, 66,-5
编程思路:设置2个指针,分别指向第一个与最后一个元素,首尾元素交换;采用loop循环指令。汇编中esi为头指针,edi为尾指针,ecx为循环次数。
开发环境
Win10 + VS2017
C语言代码实现如下:
#include <stdio.h>
int array[] = { 12,14,168,122,-33,56,78,99,345,66,-5 };
int main()
{
int i = 0;
int j = (sizeof(array) / 4) - 1;
for (int count = 0; count < sizeof(array) / (4 * 2); count++)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
i++;
j--;
}
for (int i = 0; i < sizeof(array) / 4; i++)
printf("%d\t", array[i]);
return 0;
}
汇编语言代码实现如下:
INCLUDELIB kernel32.lib
INCLUDELIB ucrt.lib
INCLUDELIB legacy_stdio_definitions.lib
.386
.model flat,stdcall
ExitProcess PROTO,
dwExitCode:DWORD
printf PROTO C : dword,:vararg
scanf PROTO C : dword,:vararg
.data
array dword 12,14,168,122,-33,56,78,99,345,66,-5
format byte '%d',9,0
.code
main Proc
mov esi,offset array
mov edi,esi
add edi,(lengthof array - 1)*4
mov ecx,(lengthof array)/2
again:
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
add esi,4
sub edi,4
loop again
mov ecx,lengthof array
xor esi,esi
print:
pushad
invoke printf,offset format,dword ptr array[esi*4]
popad
inc esi
loop print
push 0h
call ExitProcess
main endp
end main