汇编语言-004(LABEL 、间接寻址、变址操作数、指针使用、TypeDef、LOOP、DWORD变量交换高位低位字)
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-004(LABEL 、间接寻址、变址操作数、指针使用、TypeDef、LOOP、DWORD变量交换高位低位字)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1: LABEL : 為一個標號定義大小屬性,但不分配內存與下一個變量共用內存,與C中UNION類似
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCoed:DWORD.data val16 LABEL WORD val32 DWORD 12345678hLongValue LABEL DWORD val1 WORD 5678h val2 WORD 1234h.code main PROCmov ax,val16 ;5678hmov dx,[val16+2];1234hmov eax,LongValue ;12345678hINVOKE ExitProcess,0 main ENDP END main2: 間接尋址,因為常數(shù)偏移量尋址多個數(shù)組元素時,直接尋址不實用,反之,用寄存器作為指針(稱為間接尋址) 并控制寄存器的值,如果一個操作數(shù)使用的間接尋址,就稱為間接操作數(shù)
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data byteVal BYTE 10h.code main PROCmov esi,OFFSET byteValmov al,[esi];PTR與間接操作數(shù)一起使用;inc [esi] 一個操作數(shù)的大小無法從指令看出,報錯inc BYTE PTR [esi] INVOKE ExitProcess,0 main ENDP END main3: 間接尋址訪問數(shù)組案例
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data arrayB BYTE 10h,20h,30h arrayW WORD 1000h,2000h,3000h arrayD DWORD 10000h,20000h,30000h.code main PROCmov esi,OFFSET arrayBmov al,[esi]inc esimov al,[esi]inc esimov al,[esi]mov esi,OFFSET arrayWmov ax,[esi]add esi,2mov ax,[esi]add esi,2mov ax,[esi]mov esi,OFFSET arrayDmov eax,[esi]add esi,4mov eax,[esi]add esi,4mov eax,[esi]INVOKE ExitProcess,0 main ENDP END main4:變址操作數(shù),訪問數(shù)組更靈活
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data arrayB BYTE 10h,20h,30h arrayW WORD 1000h,2000h,3000h arrayD DWORD 10000h,20000h,30000h.code main PROCmov esi,0mov al,arrayB[esi] ;第一種格式constant [reg]mov esi,OFFSET arrayW ;第二種格式 [constant + reg]mov ax,[esi]mov ax,[esi+2]mov ax,[esi+4];比例因子mov esi,3 * TYPE arrayDmov eax,arrayD[esi];更簡單的做法mov esi,3 ;下標mov eax,arrayD[esi * 4];使用TYPE 更靈活mov eax,arrayD[esi * TYPE arrayD]INVOKE ExitProcess,0 main ENDP END main5: 指針使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data arrayB BYTE 10h,20h,30h,40h arrayW WORD 1000h,2000h,3000h,4000h ptrB DWORD arrayB ptrW DWORD arrayW ;使用OFFSET運算符使這種關系更加準確 optrB DWORD OFFSET arrayB optrW DWORD OFFSET arrayW.code main PROCINVOKE ExitProcess,0 main ENDP END main6: TypeDef : 定義新類型,與C的typedef 類似,不在.data段內定義的
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORDPBYTE TYPEDEF PTR BYTE ;字節(jié)指針 PWORD TYPEDEF PTR WORD ;字指針 PDWORD TYPEDEF PTR DWORD ;雙字指針.data arrayB BYTE 10h,20h,30h,40h arrayW WORD 1,2,3 arrayD DWORD 4,5,6ptr0 PBYTE ? ;未初始化 ptr1 PBYTE arrayB ptr2 PWORD arrayW ptr3 PDWORD arrayD.code main PROCmov esi,ptr1mov al,[esi]mov esi,ptr2mov ax,[esi]mov esi,ptr3mov eax,[esi]INVOKE ExitProcess,0 main ENDP END main7: LOOP : 循環(huán)偽指令使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data count DWORD ? bytes BYTE 1,2,3,4 .code main PROCmov ecx,100 ;設置外層循環(huán)計數(shù) L1:mov count,ecx ;保存外層計數(shù)mov ecx,20 ;設置內層計數(shù) L2:mov eax,ecxloop L2 ;重復內層mov ecx,count ;恢復外層計數(shù)loop L1 ;重復外層INVOKE ExitProcess,0 main ENDP END main8: LOOP_ARRAY : 數(shù)組元素求和例子
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data intarray DWORD 10000h,20000h,30000h,40000h.code main PROCmov edi,OFFSET intarray ;EDI=intarray地址 作變址操作數(shù)mov ecx,LENGTHOF intarray ;循環(huán)計數(shù)器初始化為元素個數(shù)mov eax,0 ;EAX 記錄總數(shù) L1:add eax,[edi] ;加一個元素add edi,TYPE intarray ;指向下一個元素loop L1 ;重復INVOKE ExitProcess,0 main ENDP END main9: LOOP_STRAING : 復制字符串例子
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data source BYTE "This is the source string",0 target BYTE SIZEOF source DUP(0).code main PROCmov esi,0 ;變址計數(shù)器mov ecx,SIZEOF source ;循環(huán)計數(shù)器 L1:mov al,source[esi] ;從源字符串取一個字符mov target[esi],al ;保存到目標字符串inc esi ;指向下一個字節(jié)loop L1 ;重復INVOKE ExitProcess,0 main ENDP END main10: DWORD變量交換高位低位字
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data tword LABEL WORD three DWORD 12345678h ;56781234.code main PROCmov si,tword ;或者用WORD PTR threemov di,[tword+2] ;WORD PTR [three + 2]mov tword,di ;WORD PTR threemov [tword+2],si ;WORD PTR [three + 2]mov eax,threeINVOKE ExitProcess,0 main ENDP END main總結
以上是生活随笔為你收集整理的汇编语言-004(LABEL 、间接寻址、变址操作数、指针使用、TypeDef、LOOP、DWORD变量交换高位低位字)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言-003(LAHF_SAHF 、
- 下一篇: rtmp流\http流测试地址