基本框架

include irvine32.inc
.data

.code
main proc


exit
main endp



end main

定义变量

定义int型数组和变量

c语言写法:

int chess[8][8]={0};
int a[8],b[15],c[15];
int sum=0;

汇编写法:(dd(Define Double Word)用来定义 32 位(4 个字节)的数据)

include irvine32.inc
.data
chess dd 64 dup(0)
a dd 8 dup(0)
b dd 15 dup(0)
c dd 15 dup(0)
sum dd 0
str1 db "八皇后摆法总数:", 0
str2 db "第", 0
str3 db "种可能摆法:", 0
str4 db " ", 0
str5 db "按回车键继续...", 0

基本指令

rep stosd

mov eax, 0xFFFFFFFF  ; 将EAX设置为要存储的值
mov edi, 0x1000 ; 设置目标内存地址
mov ecx, 10 ; 设置重复次数
rep stosd ; 执行重复存储操作

imul

用来做有符号的乘法

imul eax, 8 	;将eax*8放入eax中

div

; 假设我们要进行 0x123456789ABCDEF0 除以 0x12345678 的运算
mov edx, 0x12345678 ; 设置被除数的高 32 位
mov eax, 0x9ABCDEF0 ; 设置被除数的低 32 位
mov ebx, 0x12345678 ; 设置除数
div ebx ; 执行除法运算
; 此时,eax 中存放商,edx 中存放余数

call crlf

进行换行

call WriteDec

把无符号数输出到控制台

call WriteInt

把有符号数输出到控制台

寄存器的一些用法

eax

用来存放call WriteDec的值

mov  eax,sum
call writedec

edx

用来存放call WriteString的地址

mov  edx,offset str1
call writestring

实操

将下面这段c语言翻译成汇编

#include <stdio.h>
void PutQueen(int n);
int chess[8][8]={0};
int a[8],b[15],c[15];
int sum=0;
int main(int argc, char *argv[]){
int i;
for(i=0;i<8;i++ )
a[i]=1;
for(i=0;i<15;i++){
b[i]=1;
c[i]=1;
}
PutQueen(0);
printf("八皇后摆法总数: %d\n",sum);
return 0;
}
void PutQueen(int n){
int col,i,j;
for(col=0;col<8;col++){
if(a[col]&& b[n+col] && c[n-col+7]){//if_1
chess[n][col]=1;
a[col]=0;
b[n+col]=0;
c[n-col+7]=0;
if(n==7){ //if_2
sum++;
printf("第%d 种可能摆法:\n",sum);
for(i=0;i<8;i++){
printf("\t\t");
for(j=0;j<8;j++)
printf("%d ",chess[i][j]);
printf("\n");
}
printf("\n");
if(sum%10==0){
printf("按回车键继续...");
getchar();
}
}else{PutQueen(n+1);
//end if_2
chess[n][col]=0;
a[col]=1;
b[n+col]=1;
c[n-col+7]=1;
}//end if_1
}//end for
}
}

汇编代码

final2要在fianl5之前

include irvine32.inc
.data
chess dd 64 dup(0)
a dd 8 dup(0)
b dd 15 dup(0)
d dd 15 dup(0)
sum dd 0
str1 db "八皇后摆法总数:",0
str2 db "第",0
str3 db "种可能摆法:",0
str4 db " ",0
str5 db "按回车键继续...",0
.code
main proc
mov edi, offset a
mov ecx, 8
mov eax, 1
rep stosd
mov edi, offset b
mov ecx, 15
rep stosd
mov edi, offset d
mov ecx, 15
rep stosd
push 0
call PutQueen
mov edx,offset str1
call writestring
mov eax,sum
call writedec
call crlf
exit
main endp

PutQueen proc
push ebp
mov ebp,esp
pushad
mov esi,[ebp+8] ;n
mov edi,0 ;col
again1:
cmp edi,8
jge final0
mov eax,[a+4*edi]
cmp eax,0
jz final1
mov ebx,esi
add ebx,edi
mov eax,[b+4*ebx]
cmp eax,0
jz final1
mov ecx,esi
sub ecx,edi
add ecx,7
mov eax,[d+4*ecx]
cmp eax,0
jz final1
mov eax,esi
imul eax,8
add eax,edi
mov dword ptr [chess+4*eax],1
mov dword ptr [a+4*edi],0
mov dword ptr [b+4*ebx],0
mov dword ptr [d+4*ecx],0
cmp esi,7
jnz final2
inc sum
mov edx,offset str2
call writestring
mov eax,sum
call writedec
mov edx,offset str3
call writestring
call crlf
mov ebx,0 ;i
again2:
cmp ebx,8
jge final3
mov edx,offset str4
call writestring
mov ecx,0 ;j
again3:
cmp ecx,8
jge final4
mov eax,ebx
imul eax,8
add eax,ecx
mov eax,[chess+4*eax]
call writedec
mov al,' '
call writechar
inc ecx
jmp again3
final4:
call crlf
inc ebx
jmp again2
final3:
call crlf
mov edx,0
mov eax,sum
mov ebx,10
div ebx
cmp edx,0
jnz final5
mov edx,offset str5
call writestring
call readchar
call crlf
jmp final5
final2:
mov edx,esi
inc edx
push edx
call PutQueen
final5:
mov eax,esi
imul eax,8
add eax,edi
mov dword ptr [chess+4*eax],0
mov dword ptr [a+4*edi],1
mov ebx,esi
add ebx,edi
mov dword ptr [b+4*ebx],1
mov ecx,esi
sub ecx,edi
add ecx,7
mov dword ptr [d+4*ecx],1
final1:
inc edi
jmp again1
final0:
popad
leave
ret 4
PutQueen endp
end main