⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eg0417.asm

📁 宏汇编器
💻 ASM
字号:
;eg0417.asm
	include io32.inc
	.data
count	= 10
array	dword count dup(0)
temp	dword ?
readbuf	db 30 dup(0)
	.code
start:
	mov ecx,count
	mov ebx,offset array
again:	call read	; 调用子程序,输入一个数据
	mov eax,temp	; 获得出口参数
	mov [ebx],eax	; 存放到数据缓冲区
	add ebx,4
	dec ecx
	jnz again

	exit 0

read	proc	; 输入有符号十进制数的子程序
	push eax	; 出口参数:变量TEMP=补码表示的二进制数值
	push ebx	; 说明:负数用"-"引导
	push ecx
	push edx
read0:	mov eax,offset readbuf
	call readmsg	; 输入一个字符串
	test eax,eax
	jz readerr	; 没有输入数据,转向错误处理
	cmp eax,12
	ja readerr	; 输入超过12个字符,转向错误处理
	mov edx,offset readbuf	; EDX指向输入缓冲区
	xor ebx,ebx	; EBX保存结果
	xor ecx,ecx	; ECX为正负标志,0为正,-1为负
	mov al,[edx]	; 取一个字符
	cmp al,'+'	; 是"+",继续
	jz read1
	cmp al,'-'	; 是"-",设置-1标志
	jnz read2
	mov ecx,-1
read1:	inc edx	; 取下一个字符
	mov al,[edx]
	test al,al	; 是结尾0,转向求补码
	jz read3
read2:	cmp al,'0'	; 不是0~9之间的数码,则输入错误
	jb readerr
	cmp al,'9'
	ja readerr
	sub al,30h	; 是0~9之间的数码,则转换为二进制数
	imul ebx,10	; 原数值乘10:EBX=EBX×10
	jc readerr	; CF=1,说明乘积溢出,输入数据超出32位范围,出错
	movzx eax,al	; 零位扩展,便于相加
	add ebx,eax	; 原数值乘10后,与新数码相加
	cmp ebx,80000000h	; 数据超过231,出错
	jbe read1	; 继续转换下一个数位
readerr:	mov eax,offset errmsg	; 显示出错信息
	call dispmsg
	jmp read0
	;
read3:	test ecx,ecx	; 判断是正数还是负数
	jz read4
	neg ebx	; 是负数,进行求补
	jmp read5
read4:	cmp ebx,7fffffffh	; 正数超过231-1,出错
	ja readerr
read5:	mov temp,ebx	; 设置出口参数
	pop edx
	pop ecx
	pop ebx
	pop eax
	ret	; 子程序返回
errmsg	byte 'Input error, enter again: ',0
read	endp
	end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -