极安御信——masm伪指令的使用

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

以上代码均出自极安御信直播课,本文为学习笔记,请多多指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值