汇编小程序.docx
《汇编小程序.docx》由会员分享,可在线阅读,更多相关《汇编小程序.docx(14页珍藏版)》请在冰点文库上搜索。
汇编小程序
[movsx的小例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
dataENDS
.code
mainPROC
movbx,0A69Bh
movsxeax,bx;EAX=FFFFA69Bh
callDumpRegs
exit
mainENDP
ENDmain
[movzx的小例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
val1byte1
dataENDS
.code
mainPROC
moveax,0
movzxeax,val1;这里不能直接用mov指令,因为eax是32位而val1是8位的~
callDumpRegs
exit
mainENDP
ENDmain
[从控制台读一个字符然后输出]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
charbyte?
dataENDS
.code
mainPROC
moveax,0
callreadchar
movchar,al
callwritechar
exit
mainENDP
ENDmain
[N皇后问题]
TitleNqueen
includelibuser32.lib
includelibkernel32.lib
includelibIrvine32.lib
includeIrvine32.inc
.data
getsizeBYTE"输入N(正整数):
",0
nosolutionBYTE"没有解决方法",0
spaceBYTE"",0
thesizeBYTE?
solutionnumBYTE0
compareBYTE0
queenBYTE50dup(0)
.code
chargelinePROC,i:
BYTE,j:
BYTE
LOCALk:
BYTE
movesi,OFFSETqueen
movcompare,0
moval,i
movk,al
inck;
movzxeax,k
.REPEAT
moval,[esi]
.IFal==j
movcompare,1
.endif
incesi
deck
moval,k
.UNTILal==1
ret
chargelineENDP
charge1PROC,i:
BYTE,j:
BYTE
LOCALk:
BYTE
LOCALkk:
BYTE
movesi,OFFSETqueen
movcompare,0
movkk,1
moval,i
movk,al
inck
movzxeax,k
.REPEAT
moval,[esi]
subal,j
addal,i
subal,kk
.IFal==0
movcompare,1
.endif
incesi
inckk
deck
moval,k
.UNTILal==1
ret
charge1ENDP
charge2PROC,i:
BYTE,j:
BYTE
LOCALk:
BYTE
LOCALkk:
BYTE
movesi,OFFSETqueen
movcompare,0
movkk,1
moval,i
movk,al
inck
movzxeax,k
.REPEAT
moval,[esi]
subal,j
subal,i
addal,kk
.IFal==0
movcompare,1
.endif
incesi
inckk
deck
moval,k
.UNTILal==1
ret
charge2ENDP
placePROC,row:
BYTE,j:
BYTE
movesi,OFFSETqueen
movzxeax,row
addesi,eax
decesi
moval,j
mov[esi],al
ret
placeendp
printPROC
LOCALk:
BYTE
movzxecx,thesize
movk,1
movesi,OFFSETqueen
L2:
movzxeax,k
callWriteDec
movedx,OFFSETspace
callWriteString
moval,[esi]
callWriteDec
callCrlf
incesi
inck
loopL2
callCrlf
ret
printENDP
trychessPROC,row:
BYTE
LOCALj:
BYTE
movj,1
movzxecx,thesize
.REPEAT
INVOKEchargeline,row,j
moval,compare
cmpal,1
jzL1
INVOKEcharge1,row,j
moval,compare
cmpal,1
jzL1
INVOKEcharge2,row,j
moval,compare
cmpal,1
jzL1
INVOKEplace,row,j
moval,thesize
.IFal==row
incsolutionnum
INVOKEprint
exit
.ELSE
incrow
INVOKEtrychess,row
decrow
.endif
L1:
incj
moval,j
.UNTILal>thesize
RET
trychessENDP
mainPROC
movedx,OFFSETgetsize
callWriteString
callReadInt
movthesize,al
callCrlf
INVOKEtrychess,1
moval,solutionnum
.IFal==0
movedx,OFFSETnosolution
callWriteString
.endif
exit
mainENDP
ENDmain
[加法的例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
val1DWORD10000h
val2DWORD40000h
val3DWORD20000h
finalvalDWORD?
dataENDS
.code
mainPROC
callClrscr
moveax,val1
addeax,val2
subeax,val3
callwriteint;这个指令会将数用10进制输出,如何用16进制还不知道…
calldelay;这个就是实现时间延迟咯~
exit
mainENDP
ENDmain
[生成随机数]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/09
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
dataENDS
.code
mainPROC
callrandomize
movecx,10
L1:
moveax,10
callrandomrange
callwritedec
callcrlf
loopL1
callwaitmsg
exit
mainENDP
ENDmain
[输出整数的例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/03
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
str1BYTE'mynameistutu$','$'
dataENDS
.code
mainPROC
moveax,5;
addeax,4;
callwriteint;最后以十进制数输出~
exit
mainENDP
ENDmain
[输出字符串的例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/03
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
str1byte'姓名:
涂李傲',0
str2byte'学号:
2010013234',0
str3byte'班级:
软01',0
str4byte'性别:
男',0
dataENDS
.code
mainPROC
movedx,offsetstr1
callwritestring
callCrlf
movedx,offsetstr2
callwritestring
callCrlf
movedx,offsetstr3
callwritestring
callCrlf
exit
mainENDP
ENDmain
用户输入一个东西然后用2进制,10进制和16进制输出
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
hehebyte"请输入一个整数:
",0
cundword?
dataENDS
.code
mainPROC
;提示用户输入一个整数
movedx,offsethehe
callwritestring
callreadint
movcun,eax
;用十进制显示
callcrlf
callwriteint
callcrlf
callwritedec
;用十六进制显示
callcrlf
callwritehex
;用二进制显示
callcrlf
callwritebin
;现在停下~
callcrlf
callwaitmsg
exit
mainENDP
ENDmain
[整数数组求和的例子]
TITLEqksb
;Author:
TT
;CreationDate:
2012/07/05
;Revisions:
1.0
INCLUDEIrvine32.inc
dataSEGMENT
intarrayword100h,200h,300h,400h
dataENDS
.code
mainPROC
movedi,offsetintarray;这个就是间接寻址数了~
movecx,lengthofintarray;循环计数器
movax,0;累加计数器清零~
L1:
addax,[edi]
addedi,typeintarray
loopL1
callDumpRegs;
exit
mainENDP
ENDmain
显示的结果是EAX=770E0A00,后面4位是0A00=100+200+300+400所以是正确的!