程序功能:用深度优先搜索法解决八皇后问题并打印结果.
创新互联建站专注于白碱滩网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供白碱滩营销型网站建设,白碱滩网站制作、白碱滩网页设计、白碱滩网站官网定制、微信小程序开发服务,打造白碱滩网络公司原创品牌,更为您提供白碱滩网站排名全网营销落地服务。
;列数行数分别用1-8标记.所以八皇后的位置申请了9个
;调试感慨:汇编调试实在麻烦,不像C中在任何地方加个printf就可以知道
;哪错了.跳来跳去的,不知哪里死循环了,实在不好调试.
.model small,stdcall
;由于皇后位置都是一位数,所以加上30H后作字符打印出.
printResult macro
local again,print,first
push si ;不能改变它的值.
mov ah,02h ;输出状态不变.
mov cx,2 ;对称的结果,所以打两个结果.
again:
mov si,1
print:
mov dl,queen[si]
cmp cx,2
je first
mov bl,9
sub bl,dl
mov dl,bl
first:
add dl,30h
int 21h
inc si
cmp si,9 ;到第9个就是说打完了.
jnz print
mov dl,' ' ;输出两个空格,为好看.
int 21h
int 21h
loop again
pop si
endm
.data
;改来改去,何必那么小气呢?用9个多方便,就一个字节,不必这么小气!
queen db 9 dup(0)
used db 9 dup(0)
Nresult dw 0 ;结果的个数.
prompt db "The positions are:",0ah,0dh,'$'
over db 0ah,0dh,"The number of the result is $"
.code
;函数功能:把存在ax寄存器里的二进制数用十进制打印出来.
printaxd proc near
mov bx,10000d ;二个字节的数最大就3万多.
mov ch,0 ;还没出现第一个要打印的数(最高位的非0不需要打印)
mov cl,5 ;最多有五位,所以一共除五次.
mov si,ax ;哈哈,寄存器太聪明了.
go:
mov ax,si
mov dx,0 ;既然是除法,就要保证高位的绝对值最小.
div bx
dec cl ;除一次就减一次.
mov di,ax ;除完就把商移走,位置让出来给bx/10
mov si,dx ;保证余数.
;实现bx/10.
mov ax,bx
mov bx,10 ;记住乘除法运算不能用立即数.
mov dx,0 ; 实际上dl的最大值也就是9小于10,但为了保险和习惯,还是用这一句.
div bx
mov bx,ax
mov ax,di
cmp cl,0 ;如果到最后一位了,无论是0还是不为0,都要打印了.
jz next
or ch,al
jz go
next:
mov ch,1 ;有打印的了
mov dl,al
add dl,30h
mov ah,02h
int 21h
cmp cl,0
jnz go
ret ; This line cann't be forgotten.
printaxd endp
main proc far
mov ax,@data
mov ds,ax
mov es,ax
mov dx,offset prompt
mov ah,09h
int 21h
mov si,1 ;当然是从第一列开始.
go:
inc queen[si] ;当前列向下走一步.
;测试是否走出8*8的格子了
cmp queen[si],9
jnz stay
;刚好踏出格子,就把当前列置0,把上一列所在行置空,然后继续go.
mov queen[si],0
dec si
;取消所占的行.
mov al,queen[si] ;不知何以不能用movzx di,queen[si]
cbw
mov di,ax
mov used[di],0
;是否完成搜索.
cmp si,1
jnz go
;调试记语:为什么为5时不退出呢?改成4后结果居然对了.最后一个疑问了!
;对!原来如此!退出是要在queen[1]为5时,当4变成5时,这个增加的过程
;在go的第一句,也就是说此时还为4.
;于是退出条件就是当此时第一列为4而又要向前址走一步时根据对称性
;就要退出了.
cmp queen[si],4 ;利用对称性,如果第一列算到5行,就不用算了.
je exit
jmp go
stay: ;留在方格内,那么就剩下是否满足不在同一行同一斜行的问题了.
mov al,queen[si] ;不知何以不能用movzx di,queen[si]
cbw
mov di,ax
cmp used[di],1 ;如果为1就说明当前列的当前行已使用.
je go
;循环检查是否有在同一斜行的皇后.
mov di,si
dec di ; bx指向与当前列比较的列.
check:
cmp di,0
je checkover
mov dx,si ;dx装着当前列与检测列的差.,差最大不过7,所以也可以说是装在dl中.
sub dx,di
mov al,queen[si] ;al放两列的行之差.
sub al,queen[di]
cmp al,dl ;相等或相反就是在同一斜行.
je go
neg al ;求负数.
cmp al,dl
je go
dec di
jmp check
checkover:
;好,现在可以留下来了.
cmp si,8
jz result
;如果不是最后一列.
mov al,queen[si] ;不知何以不能用movzx di,queen[si]
cbw
mov di,ax
mov used[di],1 ;留下来这一行就占住了.
inc si
jmp go
result: ;好,一个结果出来了,根据对称,实际出来两个结果.
add Nresult,2
printResult
mov queen[si],0
dec si
;这四行初为设计上的漏洞,想了老半天.
mov al,queen[si] ;不知何以不能用movzx di,queen[si]
cbw
mov di,ax
mov used[di],0
jmp go
exit:
mov dx,offset over
mov ah,09h
int 21h
mov ax,Nresult
call printaxd
mov ah,01h ; to pause
int 21h
mov ah,4ch
int 21h
main endp
end main
要是上面那个不行的话,你再试一试这个,用masm5调试
.MODEL
.286
.CODE
ORG 100H
QUEEN: PUSH '$'
PUSH ' '
MOV BP,SP
LEA DX,[BP-08]
NEWL: MOV AH,'1'
NEWC: MOV CL,00
MOV SI,SP
ISOK: CMP SI,BP
JE SAVE
LODSB
SUB AL,AH
JZ NEXT
INC CX
CMP AL,CL
JE NEXT
ADD AL,CL
JZ NEXT
JMP ISOK
SAVE: PUSH AX
INC SP
CMP SP,DX
JNE NEWL
MOV AH,9
INT 21H
BACK: DEC SP
POP AX
NEXT: INC AH
CMP AH,'1'+08
JNE NEWC
CMP SP,BP
JNE BACK
INT 20H
END QUEEN
goon在汇编语言里是变量名,即变量的标识符,可以由字符,数字,以及下划线来组成。
变量名只能是字母(a-z A-Z),数字(0-9),下划线(_)的组合,并且之间不能包含空格,数字不能放在变量名首位。
变量名不能使用编程语言的保留字。比如在javascript中不能使用true,false,while,case,break保留字等等。
扩展资料
重要命名规则
在每个代码范围内使用足够短和足够长的名称:例如循环计算器用一个字符就可以了,如i;条件和循环变量用一个单词,方法名1-2个单词,类名2-3个单词,全局变量3-4个单词组成
为变量指定一些专门名称,不要使用例如 "value", "equals", "data" 这样的变量名
变量名要使用有意义的名称,通过变量名能大概反映出其具体的用途
不要在变量名前加前缀,例如 o_, obj_, m_ 之类
服从公司命名规范,在命名时使用一致的做法,例如:txtUserName, lblUserName, cmbSchoolType, ... 除非是大大降低了可读性
服从编程语言本身的规范,不要使用不连贯的小写和大写混合名称,例如:userName, UserName, USER_NAME, m_userName, username, ...
参考资料来源:百度百科-变量命名规则
它就是一种语言.
汇编语言(Assembly Language)是面向机器的程序设计语言。
在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈。这样用符号代替机器语盲的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。
使用汇编语言编写的程序,机器个能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言把汇编程序翻译成机器语言的过程称为f汇编。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。
■对于不同型号的计算机,有着不同的结构的汇编语言
汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同的结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。
汇编语言中由于使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的"汇编程序"的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。
汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。
《微机原理及汇编语言教程》