汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1:SCASW : 在wordArray中掃描16位數值0100h,將匹配元素的偏移量復制到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 結構的使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data ;定義結構 COORD STRUCTX WORD ?Y WORD ? COORD ENDS Employee STRUCTIdNum BYTE "000000000" ;9字節LastName BYTE 30 DUP(0) ;30字節ALIGN WORD ;加1個字節Years WORD 0 ;2ALIGN DWORD ;加2個字節SalaryHistory DWORD 0,0,0,0 ;16字節 Employee ENDS ;共60point1 COORD <5,10> ;x=5,y=10 point2 COORD <20> ;x=20,y=? point3 COORD <> ;x=?,y=? worker Employee<> ;默認初始值 person1 Employee<"555223333"> ;IdNum初始值,其他默認 person2 Employee <,,,2 DUP(20000)> ;只初始化SalaryHistory前兩個值,剩下兩個0;對齊結構變量 ALIGN DWORD ;要與結構中最大結構成員對齊 person Employee <>;結構數組 AllPoints COORD 3 DUP(<0,0>) ;3個結構的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 ;第一個工資mov [worker.SalaryHistory+4],3000;第二個工資mov worker.SalaryHistory+4,4000;第二個工資mov edx,OFFSET worker.SalaryHistory ;得到字段的地址;間接尋址操作數mov esi,OFFSET workermov ax,(Employee PTR[esi]).Years;變址操作數可以訪問結構數組mov esi,TYPE Employee ;索引 = 1mov department[esi].Years ,4INVOKE ExitProcess,0 main ENDP END main3:STRUCT_ALLPOINTS : 變址尋址操作數遍歷結構數組
include Irvine32.incNumPoints = 3 .data ALIGN WORD AllPoints COORD NumPoints DUP(<0,0>).code main PROCmov edi,0 ;數組索引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 : 比較結構內有對齊處理與無對齊處理的訪問時間,照道理是有對齊的快,但這里反而是無對齊快
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 : 使用結構獲取系統時間函數
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:結構內包括結構的使用
.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 :結構應用例子,醉漢行走,利用隨機數,選擇每一步行走方向
;醉漢行走,教授的起點坐標為25,25,并在周圍徘徊include 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;向隨機方向行走(北,南,東,西) ;接收:ESI=DrunkardWalk結構的指針 ;返回:結構初始化為隨機數 TakeDrunkenWalk PROCLOCAL currX:WORD,currY:WORDpushad;用OFFSET 運算符獲取path --COORD 對象數組--的地址,將其復制EDImov edi,esiadd edi,OFFSET DrunkardWalk.path ;OFFSET返回0mov ecx,WalkMax ;循環計數器mov currX,StartX ;當前X的位置mov currY,StartY ;當前Y的位置Again:;把當前位置插入數組mov ax,currXmov (COORD PTR [edi]).X,axmov ax,currYmov (COORD PTR [edi]).Y,axINVOKE DisplayPosition,currX,currYmov eax,4 ;選擇一個方向(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 ;指向下一個COORDloop AgainFinish:mov (DrunkardWalk PTR [esi]).pathsUsed,WalkMaxpopadret TakeDrunkenWalk ENDP;顯示當前X和Y的位置 DisplayPosition PROC currX:WORD,currY:WORD .data commaStr BYTE ",",0 .codepushadmovzx eax,currX ;當前X的位置call WriteDecmov edx,OFFSET commaStrcall WriteStringmovzx eax,currYcall WriteDeccall Crlfpopadret DisplayPosition ENDP END main8:UNION : 聯合使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORDInteger UNION ;初始值要一致,否則就被最大字段的初始值覆蓋D DWORD 0W WORD 0B BYTE 0 Integer ENDS;結構中包含聯合 FileInfo STRUCTFileID Integer <>FileName BYTE 64 DUP (?) FileInfo ENDS;也可以在結構中直接定義聯合 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總結
以上是生活随笔為你收集整理的汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言-016(SCASB 、STOS
- 下一篇: 重庆学车多少钱啊?