挑战性的汇编问题

来源:百度知道 编辑:UC知道 时间:2024/05/13 15:02:25
很难的,垃圾就不要瞎凑合了,只用汇编语言,其他不要,运行失败的表来
键入二进制、八进制、十进制或十六进制中任一种进制的数据(分别以B、Q、D或H作后缀,且其数值范围为00H—FFH),并显示这种进制数据的其它进制的等价形式 [ 例如:从键盘输入46Q=,则显示:46Q=100110B=38D=26H ] 。当键入的字符不符合要求时,则显示:INPUT AGAIN PLEASE!

用C写的反编译了下,不算偷懒吧,用到了几个CRT函数,用as的话要自己用ld把相应的obj文件连接一下,或者直接用gcc -o out src.s,以下是src.s的内容:

.section .rdata,"dr"
LC0:
.ascii "%s\0"
LC1:
.ascii "INPUT AGAIN PLEASE!\0"
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $92, %esp
andl $-16, %esp
movl $16, %eax
call __alloca
call ___main
leal -88(%ebp), %ebx
movl $-1, %esi
L2:
movl %ebx, 4(%esp)
movl $LC0, (%esp)
call _scanf
movl %ebx, %edi
cld
movl %esi, %ecx
movb $0, %al
repne
scasb
notl %ecx
movzbl -90(%ecx,%ebp), %edx
movl %ebx, %edi
movl %esi, %ecx
repne
scasb
notl %ecx
movb $0, -90(%ecx,%ebp)
movsbl %dl,%edi
movl %edi, 4(%esp)
movl %ebx, (%esp)
call _Validate
testb %al, %al
je L5
movl %edi, 4