X86汇编-分支、循环与子程序综合作业
1. 编写完整程序,通过API输入三个不同的正整数,然后编程求解这三个数的中间数,即大小在三个数中间的那个数,将其输出。
高级语言特性用起来!
六个判断就可以解决所有情况,代码如下
.386
.model flat,stdcall
option casemap:none
include Stdlib.Inc
includelib Stdlib.lib
include kernel32.inc
includelib kernel32.lib
.data
a dd 0
b dd 0
d dd 0
tip db 'The middle number is '
result dd 0
.code
.startup CONSOLE
invoke Readln,offset a,offset a,16
invoke Readln,offset b,offset b,16
invoke Readln,offset d,offset d,16
mov eax,a
mov ebx,b
mov edx,d
.if (eax>=ebx)&&(eax<=edx)
mov result,eax
.elseif (eax>=ebx)&&(ebx>=edx)
mov result,ebx
.elseif (ebx>=eax)&&(ebx<=edx)
mov result,ebx
.elseif (ebx>=eax)&&(eax>=edx)
mov result,eax
.elseif (edx>=eax)&&(edx<=ebx)
mov result,edx
.else
mov result,edx
.endif
invoke Writeln,offset tip
;invoke Writeln,offset result
.exit 0
运行结果为
2. 编写完整程序,首先编写一个子程序,用于比较两个字符串是否相等,其参数是两个字符串的首地址(字符串用字节 0 结束),返回值为0时表示相等,否则返回值为两个字符串中第一次不匹配的字符偏移,该子程序的定义与标准C函数 strcmp 相同。然后编写主程序,首先输入两个字符串,如果相同则输出 "Equal" ,不相同则输出 "Unequal" 。
主要思路是在子程序中实现逐字符比对,其核心在于len值的变换,对于其数值在不同条件下的判断还是需要花一些心思,核心代码已注释,如下所示
.386
.model flat,stdcall
option casemap:none
include Stdlib.Inc
includelib Stdlib.lib
include kernel32.inc
includelib kernel32.lib
.data
equal db 'Equal',0
unequal db 'Unequal',0
s1 db 64 dup(0)
s2 db 64 dup(0)
len1 dd 0
len2 dd 0
len dd 0
.code
s_cmp proc
push eax
push ebx
mov edi,0
mov esi,0
mov cl,s1[edi]
mov dl,s2[esi]
.if cl!=dl
inc len ;第一个就不匹配直接加一输出
.else
.while (cl==dl)&&(cl!=0)&&(dl!=0) ;依次比对字符
mov cl,s1[edi]
mov dl,s2[esi]
inc edi
inc esi
.if (len==eax)&&(len==ebx) ;完全匹配则跳转结束,防止再次加1
mov len,0
jmp s_eq
.endif
inc len ;持续记录匹配的数量
.endw
.endif
s_eq: pop ebx
pop eax