組合語言-009(表驅動選擇 、條件控制流偽指令 、邏輯移位SHL,SHR 算術移位SAL,SAR)
阿新 • • 發佈:2020-12-26
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