masm伪指令的使用
Tips:这是一个用masm x86汇编写的加减运算程序
我们先将dwNumber1和dwNumber2以及单个字符nChar拖进监视器里面单步观察
给dwNumber1输入123,在单步过scanfBaye的时候,发现监视器里面的nChar存储的数据变成了\n
这是因为输入完dwNumber1之后会有一个回车,导致我们封装的scanfByte函数先将这个回车接收了,从而无法接收我们的运算符。所以我们需要在输入后面加一个getchar,将这个回车取走,让scanfByte能够成功接收我们输入的运算符
代码
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 scanf:proc
extern printf:proc
extern getchar:proc
extern putchar:proc
LineFeed MACRO
push 0dh
call putchar
push 0ah
call putchar
add esp,8
endm
.data
dwIndex dd ?
dwNumber dd ?
nChar db ?
dwNumber1 dd ?
dwNumber2 dd ?
szBuffer db "Allure_Love",0
szText1 db "Input Number:",0
szText2 db "Input Operator:",0
szFormatS db "%s",0
szFormatD db "%d",0
szFormatC db "%c",0
Entry.asm
include Entry.inc
.code
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
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
;加法
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
mov eax,num1
sub eax,num2
ret
rsub endp
main proc
;判断
;mov dwIndex,11
;.if dwIndex == 10
; mov dwNumber,10
; invoke printNumber,dwNumber
;.elseif dwIndex == 11
; mov dwNumber,11
; invoke printNumber,dwNumber
;.elseif dwIndex == 12
; mov dwNumber,12
; invoke printNumber,dwNumber
;.else
; mov dwNumber,666
; invoke printNumber,dwNumber
;.endif
;循环
;mov dwIndex,100
;.while dwIndex > 0
; invoke printNumber,dwIndex
; LineFeed
; dec dwIndex
;.endw
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 ;通常加减法的运算结果都在eax寄存器里
.elseif nChar == '-'
invoke rsub,dwNumber1,dwNumber2
invoke printNumber,eax
.endif
invoke ExitProcess,0
main endp
end
以上代码均出自极安御信直播课,本文为学习笔记,请多多指教