汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1:SCASW : 在wordArray中掃描16位數(shù)值0100h,將匹配元素的偏移量復(fù)制到EAX
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov ecx,LENGTHOF wordArraycld repne scaswjne L1sub edi,TYPE wordArraymov eax,edijmp quit L1:mov eax,0 quit:INVOKE ExitProcess,0 main ENDP END main2: STRUCT : 偽指令STRUCT 結(jié)構(gòu)的使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data ;定義結(jié)構(gòu) COORD STRUCTX WORD ?Y WORD ? COORD ENDS Employee STRUCTIdNum BYTE "000000000" ;9字節(jié)LastName BYTE 30 DUP(0) ;30字節(jié)ALIGN WORD ;加1個(gè)字節(jié)Years WORD 0 ;2ALIGN DWORD ;加2個(gè)字節(jié)SalaryHistory DWORD 0,0,0,0 ;16字節(jié) Employee ENDS ;共60point1 COORD <5,10> ;x=5,y=10 point2 COORD <20> ;x=20,y=? point3 COORD <> ;x=?,y=? worker Employee<> ;默認(rèn)初始值 person1 Employee<"555223333"> ;IdNum初始值,其他默認(rèn) person2 Employee <,,,2 DUP(20000)> ;只初始化SalaryHistory前兩個(gè)值,剩下兩個(gè)0;對(duì)齊結(jié)構(gòu)變量 ALIGN DWORD ;要與結(jié)構(gòu)中最大結(jié)構(gòu)成員對(duì)齊 person Employee <>;結(jié)構(gòu)數(shù)組 AllPoints COORD 3 DUP(<0,0>) ;3個(gè)結(jié)構(gòu)的X,Y都為0department Employee 5 DUP(<>).code main PROCmov eax,TYPE Employee ;60mov eax,SIZEOF Employee;60mov eax,SIZEOF worker ;60;引用成員mov dx,worker.Yearsmov worker.SalaryHistory,20000 ;第一個(gè)工資mov [worker.SalaryHistory+4],3000;第二個(gè)工資mov worker.SalaryHistory+4,4000;第二個(gè)工資mov edx,OFFSET worker.SalaryHistory ;得到字段的地址;間接尋址操作數(shù)mov esi,OFFSET workermov ax,(Employee PTR[esi]).Years;變址操作數(shù)可以訪(fǎng)問(wèn)結(jié)構(gòu)數(shù)組mov esi,TYPE Employee ;索引 = 1mov department[esi].Years ,4INVOKE ExitProcess,0 main ENDP END main3:STRUCT_ALLPOINTS : 變址尋址操作數(shù)遍歷結(jié)構(gòu)數(shù)組
include Irvine32.incNumPoints = 3 .data ALIGN WORD AllPoints COORD NumPoints DUP(<0,0>).code main PROCmov edi,0 ;數(shù)組索引mov ecx,NumPointsmov ax,1 ;起始X,Y的值 L1:mov (COORD PTR AllPoints[edi]).X,axmov AllPoints[edi].Y,axadd edi,TYPE COORDinc axloop L1exit main ENDP END main4:STRUCT_ALIGN : 比較結(jié)構(gòu)內(nèi)有對(duì)齊處理與無(wú)對(duì)齊處理的訪(fǎng)問(wèn)時(shí)間,照道理是有對(duì)齊的快,但這里反而是無(wú)對(duì)齊快
include Irvine32.incEmployeeBad STRUCTIdNum BYTE "000000000"LastName BYTE 30 DUP(0)Years WORD 0SalaryHistory DWORD 0,0,0,0 EmployeeBad ENDSEmployee STRUCTIdNum BYTE "000000000"LastName BYTE 30 DUP(0)ALIGN WORDYears WORD 0ALIGN DWORDSalaryHistory DWORD 0,0,0,0 Employee ENDS.data ALIGN DWORD startTime DWORD ? emp Employee <> ;或:EmployeeBad .code main PROCcall GetMSecondsmov startTime,eaxmov ecx,0FFFFFFFFh L1:mov emp.Years,5mov emp.SalaryHistory,35000loop L1call GetMSecondssub eax,startTimecall WriteDecexit main ENDP END main5: SYSTEMTIME : 使用結(jié)構(gòu)獲取系統(tǒng)時(shí)間函數(shù)
include Irvine32.incCOMMENT % COORD STRUCTX WORD ?Y WORD ? COORD ENDS SYSTEMTIME STRUCTwYear WORD ?wMonth WORD ?wDayOfWeek WORD ?wDay WORD ?wHour WORD ?wMinute WORD ?wSecond WORD ?wMilliseconds WORD ? SYSTEMTIME ENDS %.data sysTime SYSTEMTIME <>.code main PROCINVOKE GetLocalTime ,ADDR sysTimemovzx eax,sysTime.wYearcall WriteDecexit main ENDP END main6:結(jié)構(gòu)內(nèi)包括結(jié)構(gòu)的使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORDCOORD STRUCTX WORD ?Y WORD ? COORD ENDS Rectangle STRUCTUpperLeft COORD <>LowerRight COORD <> Rectangle ENDS .data rect1 Rectangle <> rect2 Rectangle {} rect3 Rectangle {{10,10},{50,20}} rect4 Rectangle <<10,10>,<50,20>>.code main PROCmov rect1.UpperLeft.X , 10mov esi,OFFSET rect1mov (Rectangle PTR [esi]).UpperLeft.Y,10mov edi,OFFSET rect2.LowerRightmov (COORD PTR [edi]).X,50mov edi,OFFSET rect2.LowerRight.Xmov WORD PTR[edi],50INVOKE ExitProcess,0 main ENDP END main7:STRUCT_WALK :結(jié)構(gòu)應(yīng)用例子,醉漢行走,利用隨機(jī)數(shù),選擇每一步行走方向
;醉漢行走,教授的起點(diǎn)坐標(biāo)為25,25,并在周?chē)腔瞚nclude Irvine32.inc WalkMax = 50 StartX = 25 StartY = 25DrunkardWalk STRUCTpath COORD WalkMax DUP (<0,0>)pathsUsed WORD 0 DrunkardWalk ENDSDisplayPosition PROTO currX:WORD,currY:WORD.data aWalk DrunkardWalk <>.code main PROCmov esi,OFFSET aWalkcall TakeDrunkenWalkexit main ENDP;向隨機(jī)方向行走(北,南,東,西) ;接收:ESI=DrunkardWalk結(jié)構(gòu)的指針 ;返回:結(jié)構(gòu)初始化為隨機(jī)數(shù) TakeDrunkenWalk PROCLOCAL currX:WORD,currY:WORDpushad;用OFFSET 運(yùn)算符獲取path --COORD 對(duì)象數(shù)組--的地址,將其復(fù)制EDImov edi,esiadd edi,OFFSET DrunkardWalk.path ;OFFSET返回0mov ecx,WalkMax ;循環(huán)計(jì)數(shù)器mov currX,StartX ;當(dāng)前X的位置mov currY,StartY ;當(dāng)前Y的位置Again:;把當(dāng)前位置插入數(shù)組mov ax,currXmov (COORD PTR [edi]).X,axmov ax,currYmov (COORD PTR [edi]).Y,axINVOKE DisplayPosition,currX,currYmov eax,4 ;選擇一個(gè)方向(0到3)call RandomRange.IF eax == 0 ;北dec currY.ELSEIF eax == 1 ;南inc currY.ELSEIF eax == 2 ;西dec currX.ELSEinc currX ;東.ENDIFadd esi,TYPE COORD ;指向下一個(gè)COORDloop AgainFinish:mov (DrunkardWalk PTR [esi]).pathsUsed,WalkMaxpopadret TakeDrunkenWalk ENDP;顯示當(dāng)前X和Y的位置 DisplayPosition PROC currX:WORD,currY:WORD .data commaStr BYTE ",",0 .codepushadmovzx eax,currX ;當(dāng)前X的位置call WriteDecmov edx,OFFSET commaStrcall WriteStringmovzx eax,currYcall WriteDeccall Crlfpopadret DisplayPosition ENDP END main8:UNION : 聯(lián)合使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORDInteger UNION ;初始值要一致,否則就被最大字段的初始值覆蓋D DWORD 0W WORD 0B BYTE 0 Integer ENDS;結(jié)構(gòu)中包含聯(lián)合 FileInfo STRUCTFileID Integer <>FileName BYTE 64 DUP (?) FileInfo ENDS;也可以在結(jié)構(gòu)中直接定義聯(lián)合 FileInfo2 STRUCTUNION FileIDD DWORD ?W WORD ?B BYTE ?ENDSFileName BYTE 64 DUP(?) FileInfo2 ENDS.data myInt Integer <> val1 Integer <12345678h> val2 Integer <100h> val3 Integer <>.code main PROCmov val3.B , almov val3.W,axmov val3.D,eaxINVOKE ExitProcess,0 main ENDP END main總結(jié)
以上是生活随笔為你收集整理的汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编语言-016(SCASB 、STOS
- 下一篇: 汇编语言-018(FLD 、FST、FS