1. 程式人生 > 其它 >組合語言-009(表驅動選擇 、條件控制流偽指令 、邏輯移位SHL,SHR 算術移位SAL,SAR)

組合語言-009(表驅動選擇 、條件控制流偽指令 、邏輯移位SHL,SHR 算術移位SAL,SAR)

技術標籤:彙編反彙編

1: 表驅動選擇,用查表來代替多路選擇結構的一種方法

.386
.model flat,stdcall

include Irvine32.inc

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
CaseTable BYTE 'A'             ;查詢值
          DWORD Process_A      ;過程地址
EntrySize = ($ - CaseTable)
          BYTE 'B'             ;查詢值
          DWORD Process_B      ;
過程地址 BYTE 'C' ;查詢值 DWORD Process_C ;過程地址 BYTE 'D' ;查詢值 DWORD Process_D ;過程地址 NumberOfEntries = ($ - CaseTable) / EntrySize prompt BYTE "Press capital A,B,C or D",0 msgA BYTE "Process_A",0 msgB BYTE "Process_B",
0 msgC BYTE "Process_C",0 msgD BYTE "Process_D",0 .code main PROC mov edx,OFFSET prompt call WriteString call ReadChar mov ebx ,OFFSET CaseTable mov ecx,NumberOfEntries L1: cmp al,[ebx] jne L2 call NEAR PTR [ebx+1] call WriteString call Crlf jmp L3 L2: add ebx,
EntrySize loop L1 L3: exit main ENDP Process_A PROC mov edx,OFFSET msgA ret Process_A ENDP Process_B PROC mov edx,OFFSET msgB ret Process_B ENDP Process_C PROC mov edx,OFFSET msgC ret Process_C ENDP Process_D PROC mov edx,OFFSET msgD ret Process_D ENDP END main

2: 條件控制流偽指令,在彙編器預處理時生成ASM程式碼,可在反彙編視窗檢視

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
val1 DWORD 10
result DWORD ?

.code
main PROC
   mov eax,6
   .IF eax > val1
      mov result,1
	.ENDIF
   INVOKE ExitProcess,0
main ENDP
END main

3: 條件控制流偽指令,例子應用 ||

.386
.model flat,stdcall

include Irvine32.inc

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.code
main PROC
  INVOKE ExitProcess,0
main ENDP

SetCursorPosition PROC
.data
BadXCoordMsg BYTE "X-Coordinate out of range!",0Dh,0Ah,0
BadYCoordMsg BYTE "Y-Coordinate out of range!",0Dh,0Ah,0

.code
  .IF (dl < 0 )||( dl > 79)
      mov edx,OFFSET BadXCoordMsg
	  call WriteString
	  jmp quit
   .ENDIF
   .IF(dh < 0 )||(dh > 24)
      mov edx,OFFSET BadYCoordMsg
	  call WriteString
	  jmp quit
    .ENDIF
 call Gotoxy
quit:
  ret
 SetCursorPosition ENDP

 END main

4: 條件控制流偽指令,例子應用 &&

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
TRUE = 1
FALSE = 0
gradeAverage WORD 275  ;要檢查的數值
credits  WORD 12       ;要檢查的數值
OkToRegister BYTE ? 

.code
main PROC
   mov OkToRegister,FALSE
   .IF gradeAverage > 350
       mov OkToRegister,TRUE
	.ELSEIF (gradeAverage > 250) && (credits <= 16)
	   mov OkToRegister,TRUE
	.ELSEIF (credits <= 12)
	   mov OkToRegister,TRUE
	.ENDIF
	
   INVOKE ExitProcess,0
main ENDP
END main

5: 條件控制流偽指令,.REPEAT .UNTIL和 .WHILE迴圈的使用

.386
.model flat,stdcall

include Irvine32.inc


.stack 4096
ExitProcess PROTO,dwExitCode:DWORD


.code
main PROC
   mov eax,0
   .WHILE eax<10
      inc eax
	  call WriteDec
	  call Crlf
	.ENDW

	mov eax,0
	.REPEAT
	   inc eax
	   call WriteDec
	   call Crlf
	.UNTIL eax == 10
   INVOKE ExitProcess,0
main ENDP
END main

6: .WHILE 迴圈內包含 .IF語句的使用

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
X DWORD 0
op1 DWORD 2 ;被檢測的資料
op2 DWORD 4 ;被檢測的資料
op3 DWORD 5 ;被檢測的資料

.code
main PROC
  mov eax,op1
  mov ebx,op2
  mov ecx,op3
  .WHILE eax < ebx
     inc eax
	 .IF eax == ecx
	    mov X,2
	 .ELSE
	    mov X,3
	 .ENDIF
   .ENDW
  INVOKE ExitProcess,0
main ENDP
END main

7: 若DX的無符號數小於等於CX就跳轉 若AX的有符號數大於CX就跳轉

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.code
main PROC

  INVOKE ExitProcess,0
main ENDP

proc_1 PROC
    cmp dx,cx
	jbe L1
	ret
L1:
     ret
proc_1 ENDP

proc_2 PROC
    cmp ax,cx
	jg L2
	ret
L2:
     ret
proc_2 ENDP

END main

8: 清除AL的位0和位1,若目的運算元等於0,跳轉到L3,否則跳轉到L4

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.code
main PROC
  mov al,5
  and al,0FCh
  jnz L4
L3:
  mov ecx,0
  jmp quit
L4:
  mov ecx,1
quit:
  INVOKE ExitProcess,0
main ENDP
END main

9: 奇偶性檢查,使用位元組XOR的方式對陣列所佔的位元組空間進行奇偶性檢查,判斷是偶校驗還是奇校驗

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
bList1 BYTE 1,2,3,4,5,6,7,8,9,10   ;奇校驗的
bList2 BYTE 1,2,3,4,5,6,7,8,9,2    ;偶校驗的

.code
main PROC

    mov ebx,OFFSET bList1
	mov ecx,SIZEOF bList1
	call myCheck

    mov ebx,OFFSET bList2
	mov ecx,SIZEOF bList2
	call myCheck
	INVOKE ExitProcess,0
main ENDP

myCheck PROC

   dec ecx
   mov dl,[ebx]
L1:
   pushfd
   inc ebx
   popfd
   xor dl,[ebx]
   loop L1
   
   lahf     ;載入8位標誌位到AH
   mov dl,ah ;儲存到DL
   and dl,4  ;與位運算後,只保留奇偶位了
   cmp dl,0
   jne L2
   mov eax,0
   ret
L2:
   mov eax,1
   ret
myCheck ENDP

END main

10: 邏輯移位SHL,SHR 算術移位SAL,SAR

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.code
main PROC
  ;左移
   mov bl,8Fh ;BL = 10001111b
   shl bl,1   ;CF = 1 ,BL = 00011110b
   mov al,10000000b
   shl al,2   ;CF = 0,AL=00000000b

   ;右移
   mov al,0D0h   ;AL = 11010000b
   shr al,1      ;AL = 01101000b  CF = 0
   mov al,00000010b   
   shr al,2      ;AL = 00000000b , CF =1

   ;算術左移
   mov bl,8Fh ;BL = 10001111b
   sal bl,1   ;CF = 1 ,BL = 00011110b
   mov al,10000000b
   sal al,2   ;CF = 0,AL=00000000b

   ;算術右移
   mov al,0F0h   ;AL = 11110000b (-16)
   sar al,1      ;AL = 11111000b (-8) CF = 0

   ;AXt符號擴充套件到EAX
   mov ax,-128   ;EAX = ????FF80h
   shl eax,16    ;EAX = FF800000h
   sar eax,16    ;EAX = FFFFFF80h

   INVOKE ExitProcess,0
main ENDP
END main