我试图用汇编语言x86编写代码,但由于某些原因我的程序崩溃了。这是作业。 编写汇编语言函数,它将接收10个16位值和a的列表(数组) 数字N,在1-10之间,由用户输入。 AL函数应将第N个值移动到列表的前面 以下方式: 将所有值从元素1推送到堆栈上的元素N-1。将元素N处的值重新定位到元素1。 弹出堆栈并将其元素恢复到位置N,N-1,...,2
这是我的代码
void __declspec (naked) asmSwitch(short[], int)
{
__asm
{
push ebp
push eax
push ebx
push ecx
push edx
push ebx
mov ebp, esp
mov ecx, [ebp + 12] ; the element
dec ecx ;
mov ebx, [ebp + 8] ; est ptr to array
TOP: push [ebx] ;
inc ebx ;
inc ebx
loop TOP
mov ax, [ebx]
mov ebx, [ebp + 8]
mov [ebx], ax
mov ecx, [ebp + 12]
dec ecx
mov eax, ecx
add eax, eax
add ebx, eax
TOP1: pop [ebx]
dec ebx
dec ebx
loop TOP1
pop esi
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
}
}
我在
上收到了读取违规错误 TOP: push [ebx] ;
编译后我的程序崩溃了。
答案 0 :(得分:0)
EBP
和[ebp + 12]
需要适当的[ebp + 8]
。因此,将其初始化直接移至push ebp
:
...
push ebp
mov ebp, esp
...
push [ebx]
推送DWORD(32位),因为堆栈通常是32位组织的。 pop [ebx]
弹出一个WORD(16位)因为汇编程序识别出16位数组。因此,ret
将从堆栈中获得完全错误的值。同步类型:
...
push WORD PTR [ebx]
...
pop WORD PTR [ebx]
...