如何解决生成 IA-32 Assembly
我必须使用 Visual Studio 在 IA-32 程序集中创建一个 asm 块。
我曾尝试按字典顺序使用生成,但现在卡住了,因为我不知道如何继续。
我无法添加变量,也无法更改用 C 编写的部分。我只能创建 asm 块。
作为指南,我使用了维基百科页面,上面写着:
以下算法生成下一个排列 在给定的排列之后按字典顺序排列。它改变了给定的 就地排列。
例如,给定序列 [1,2,3,4](按升序排列),并且假设索引是 从零开始,步骤如下:
- 索引k = 2,因为3放在满足条件的索引处 是仍然小于 a[k + 1] 的最大索引,即 4
- 索引 l = 3,因为为满足条件 a[k]
- 该 a[2] 和 a[3] 的值交换形成新序列 [1,4,3]。
- k-index a[2] 之后到最后一个元素的序列是 颠倒了。因为只有一个值位于该索引(3)之后,所以 在这种情况下,顺序保持不变。因此字典序 初始状态的后继被置换:[1,3]。
按照这个 算法,下一个字典排列将是 [1,4],和 第 24 次排列将是 [4,1],此时 a[k]
/********************************************************************************
Descrizione: Generate all permutations of the first N natural numbers.
The permutations generated must be inserted within a single
array of integers. For example,if N = 3,the array must contain:
{1,1,1}.
********************************************************************************/
#include <stdio.h>
void main()
{
// Variabiles
int N=4; // number of integers (<=6)
int Perm[4326]; // array permutations: size is sufficient for N <= 6
int Num = 0; // At the end it must contain the number of permutations generated
//asm block
__asm
{
MOV EAX,N
XOR EBX,EBX //K+1
MOV ECX,1 //Counter K
MOV EDX,N //L
XOR ESI,ESI //Permutation Counter
XOR EDI,EDI
Inizializzazione : //Set the first N numbers of the array in order
MOV Perm[ECX*4-4],ECX
INC ECX
CMP ECX,EAX
JLE Inizializzazione
INC ESI
MakeOffset: //Use MUL to set the offset index in EDI
MOV EAX,1
MUL ESI
MOV EDI,EAX
PermStore:
INC EDI
MOV ECX,Perm[EDI*4-4] //a[K+1]
DEC EDI
MOV EBX,Perm[EDI*4-4] //a[K]
CMP EBX,ECX
JL Swap
DEC EDI
JNS PermStore
DEC EAX
JS End
MOV EDI,EAX
DEC EDI
JMP PermStore
Swap:
DEC EDX
MOV ECX,Perm[EDX*4-4] //a[L]
CMP ECX,EBX
JG Greater
Greater:
//I have to use ECX (which is L) and EBX (a[k]),I have to use EDI for K and EAX for the offset moltiplications of L
//Now I take a[k] and store it in position L and then I store the one which was in L in position K
Reverse: //Reverse the sequence from a[k + 1] up to and including the final element a[n]
End:
}
// Stampa su video
{
int i,j,k;
printf("Permutazioni dei primi %d numeri naturali\n",N);
for (i=k=0;i<Num;i++)
{
for (j=0;j<N;j++)
{
printf("%3d",Perm[k++]);
}
printf("\n");
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。