具体过程:

用visual studio2022新建一个x86汇编项目

二 伪指令if() else()在x86汇编中的应用

entry.asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
include entry.inc

.code

printNumber proc Number:dword
mov eax,Number
push eax
mov eax,offset szFormatd
push eax
call printf
add esp,8
ret
printNumber endp

main proc
mov dwIndex,11
.if dwIndex == 10
mov dwNumber,10
invoke printNumber,dwNumber
.elseif dwNumber == 11
mov dwNumber,11
invoke printNumber, dwNumber
.elseif dwIndex == 12
mov dwNumber,12
invoke printNumber, dwNumber
.else
mov dwNumber,666
invoke printNumber,dwNumber
.endif
invoke ExitProcess,0
main endp
end

entry.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.586
.model flat,stdcall
option casemap:none

include include/windows.inc
include include/User32.inc
include include/Kernel32.inc
includelib ucrt.lib
includelib User32.lib
includelib kernel32.lib
includelib legacy_stdio_definitions.lib

extern printf:proc

.data
szBuffer db"how you doing",0
dwIndex dd ?
szFormatd db "%d",0
dwNumber dd ?

三 伪指令.while在x86汇编中的应用

entry.asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
;entry.asm
include entry.inc

.code

printNumber proc Number:dword
mov eax,Number
push eax
mov eax,offset szFormatd
push eax
call printf
add esp,8
ret
printNumber endp

main proc
mov dwIndex,100
.while dwIndex >0
.if dwIndex == 50
jmp lp
.endif
invoke printNumber,dwIndex
LineFeed;调用宏用来换行
lp:
dec dwIndex
.endw
invoke ExitProcess,0
main endp
end

entry.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
;entry.inc
.586
.model flat,stdcall
option casemap:none

include include/windows.inc
include include/User32.inc
include include/Kernel32.inc
includelib ucrt.lib
includelib User32.lib
includelib kernel32.lib
includelib legacy_stdio_definitions.lib

extern printf:proc
extern putchar:proc

LineFeed MACRO
push 0dh
call putchar
push 0ah
call putchar
add esp,8
endm

.data
szBuffer db"how you doing",0
dwIndex dd ?
szFormatd db "%d",0
dwNumber dd ?

四 使用伪指令在x86汇编中输入打印文本

entry.inc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
;entry.inc
.586
.model flat,stdcall
option casemap:none

include include/windows.inc
include include/User32.inc
include include/Kernel32.inc
includelib ucrt.lib
includelib User32.lib
includelib kernel32.lib
includelib legacy_stdio_definitions.lib

extern printf:proc
extern scanf:proc
extern putchar:proc
extern getchar:proc

LineFeed MACRO
push 0dh
call putchar
push 0ah
call putchar
add esp,8
endm

.data

szBuffer db"how you doing",0
dwIndex dd ?
szFormatd db "%d",0
szFormats db "%s",0
szFormatc db "%c",0
dwNumber dd ?
nChar db ?
szText1 db "Input Number:",0
szText2 db "input Operator:",0
dwNumber1 dd ?
dwNumber2 dd ?

entry.asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
;entry.asm
include entry.inc

.code
printText proc String:dword
mov eax,String
push eax
mov eax,offset szFormats
push eax
call printf
add esp,8
ret
printText endp

printNumber proc Number:dword
mov eax,Number
push eax
mov eax,offset szFormatd
push eax
call printf
add esp,8
ret
printNumber endp

scanfNumber proc Number:dword
mov eax,Number
push eax
mov eax,offset szFormatd
push eax
call scanf
add esp,8
ret
scanfNumber endp

scanfByte proc
mov eax,offset nChar
push eax
mov eax,offset szFormatc
push eax
call scanf
add esp,8
ret
scanfByte endp

radd proc num1:dword,num2:dword
xor eax,eax
add eax,num1
add eax,num2
ret
radd endp

rsub proc num1:dword,num2:dword
xor eax,eax
add eax,num1
add eax,num2
ret
rsub endp

main proc
invoke printText,offset szText1
invoke scanfNumber,offset dwNumber1
call getchar
invoke printText,offset szText2
invoke scanfByte
invoke printText,offset szText1
invoke scanfNumber,offset dwNumber2
.if nChar =='+'
invoke radd,dwNumber1,dwNumber2
invoke printNumber,eax
.elseif nChar == '-'
invoke rsub,dwNumber1,dwNumber2
invoke printNumber,eax
.endif
invoke ExitProcess,0
main endp
end