gpt4 book ai didi

c - Shellsort:用 C 编写 NASM 代码

转载 作者:行者123 更新时间:2023-11-30 19:43:56 25 4
gpt4 key购买 nike

我正在尝试将 C 函数转换为 32 位 NASM。

这是 C 函数

void shellsort (int *A, int n)
{
int gap, i, j, temp;
for (gap = n/2; gap > 0; gap /=2)
{
for (i= gap; i<n; i++)
{
for (j=i-gap; j>=0 && A[j] > A[j+gap]; j-=gap)
{
temp = A[j];
A[j] = A[j+gap]
A[j+gap] = temp;
}
}
}
}

这是我到目前为止所做的

%include "asm_io.inc"

SECTION .data

SECTION .bss

SECTION .text

extern printf

global sort

sort:

push ebp ;set up stack frame
mov ebp, esp

sub esp, 0x10 ;assign 16byte space for local variables

firstloop:

mov eax, [ebp+8] ;moves value of n into eax
mov edx, 0 ;prepares for division, remainder init
mov ecx, 2 ;divisor

div ecx ;division, store gap in eax

cmp eax, 0 ;compare if gap with zero
jle firstloopDone ;firstloopDone

firstloopDone:

div ecx
jmp done

secondloop:

mov ecx, eax ;copy value of gap into ecx, i=gap
cmp ecx, [ebp+8] ;compare i with 1st parameter n

jge secondloopDone ;jump to secondloop if greater-equal
inc ecx ;increment i
jmp thirdloop ;jump to thirdloop

secondloopDone:

inc ecx ;increment i
jmp firstloop ;jump to firstloop

thirdloop:

mov edx, ecx ;save i value
sub ecx, eax ;subtract gap from i and store in ecx

cmp ecx, 0 ;compare j with zero
jl thirdloopDone ;if not j>=0, then skip to end of loop

cmp [ebp+12+ecx], [ebp+12+ecx+eax] ;compare A[j] and A[j+gap]
jle thirdloopDone
sub ecx, eax ;subtract gap from j and store in ecx
jmp swap

thirdloopDone:

sub ecx, eax ;j-gap
jmp secondloop ;jump to second loop

swap:

mov edx, [ebp+12+ecx] ;copy A[j] to temp
mov [ebp+12+ecx], [ebp+12+ecx+eax] ;A[j]=A[j+gap]
mov [edp+12+ecx+eax], edx ;A[j+gap]= temp
jmp thirdloop

done:

leave ;destroy stack frame
ret

不用说,这是行不通的。错误消息显示:

“错误:beroset-p-603-有效地址无效”

第 58 行(第三循环)

cmp [ebp+12+ecx],[ebp+12+ecx+eax]

第 71 行(交换)

mov edx,[ebp+12+ecx]

我知道这可能是错误的方法。但是从 C 代码中的嵌套循环来看,我有太多变量需要保留,所以我无法腾出任何寄存器。

此外,我怀疑我可能对堆栈帧没有正确的理解,这可能会显示在我的代码中。

任何帮助或错误发现,我们将不胜感激。谢谢。

最佳答案

你说你没有足够的寄存器来使用,但你甚至不使用 EBX、ESI 或 EDI。您为局部变量做了规定,但没有使用任何变量。

firstloop:
mov eax, [ebp+8] ;moves value of n into eax
mov edx, 0 ;prepares for division, remainder init
mov ecx, 2 ;divisor
div ecx ;division, store gap in eax

前面的代码不需要除法。通过移位操作来简化它。 shr​​ eax,1

下一个代码将始终终止。使用jle完成

 cmp eax, 0                          ;compare if gap with zero
jle firstloopDone ;firstloopDone
firstloopDone:
div ecx
jmp done

参数不是从右向左推的吗?

 mov ebx, [ebp+8]   ;pointer to array A
firstloop:
mov eax, [ebp+12] ;number of elemnets n

您通常需要编写代码

swap:
mov edx, [ebx+ecx*4] ;TEMP=A[j]
add ecx,eax
xchg edx, [ebx+ecx*4] ;Swap A[j+gap] with TEMP
sub ecx, eax
mov [ebx+ecx*4], edx ;A[j]=TEMP
jmp thirdloop

关于c - Shellsort:用 C 编写 NASM 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28956416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com