32、编写一个程序,比较递归阶乘过程和非递归阶乘过程的运行速度。使用GetMseconds过程来测量并显示连续调用每个阶乘过程数千次所需的毫秒数。
首先调用 GetMseconds
获取开始时间,接着多次调用递归阶乘过程,之后再次调用 GetMseconds
获取结束时间,通过结束时间减去开始时间得到递归阶乘过程的执行时间。同理,对非递归阶乘过程进行相同操作。最后显示两个阶乘过程各自所需的毫秒数。
示例代码框架如下:
INCLUDE Irvine32.inc
; 假设这里有递归阶乘过程和非递归阶乘过程的定义
.data
startTime DWORD ?
recursiveTime DWORD ?
nonrecursiveTime DWORD ?
.code
main PROC
; 测量递归阶乘过程的时间
call GetMseconds ; 获取开始时间
mov startTime, eax
mov ecx, 数千次的循环次数
L1:
call 递归阶乘过程
loop L1
call GetMseconds ; 获取结束时间
sub eax, startTime ; 计算经过的时间
mov recursiveTime, eax ; 保存递归阶乘过程的经过时间
; 测量非递归阶乘过程的时间
call GetMseconds ; 获取开始时间
mov startTime, eax
mov ecx, 数千次的循环次数
L2:
call 非递归阶乘过程
loop L2
call GetMseconds ; 获取结束时间
sub eax, startTime ; 计算经过的时间
mov nonrecursiveTime, eax ; 保存非递归阶乘过程的经过时间
; 显示结果
mov eax, recursiveTime
call WriteDec
mov al, ' ' ; 空格分隔
call WriteChar
mov eax, nonrecursiveTime
call WriteDec
call Crlf
exit
main ENDP
END main
需根据实际情况补充递归阶乘过程和非递归阶乘过程的具体实现,以及设置合适的循环次数。
33、编写一个名为ShowParams的过程,该过程显示调用它的过程的运行时栈上32位参数的地址和十六进制值。参数将按从最低地址到最高地址的顺序显示。该过程的输入是一个整数,用于指示要显示的参数数量。
以下是实现该功能的汇编代码示例(以x86汇编为例):
;---------------------------------------------------------
ShowParams PROC
; 显示调用它的过程的运行时栈上32位参数的地址和十六进制值
; 接收: EAX,参数数量
;---------------------------------------------------------
push ebx ; 保存ebx
push ecx ; 保存ecx
push edx ; 保存edx
mov ecx, eax ; 将参数数量存入ecx
mov ebx, [ebp + 8] ; 获取第一个参数的地址
LoopDisplay:
mov edx, ebx ; 显示参数地址
call WriteHex ; 假设WriteHex过程已定义
mov al, ' ' ; 显示空格
call WriteChar ; 假设WriteChar过程已定义
mov eax, [ebx] ; 获取参数值
call WriteHex ; 显示参数的十六进制值
mov al, 0Dh ; 换行符
call WriteChar
mov al, 0Ah
call WriteChar
add ebx, 4 ; 指向下一个32位参数
loop LoopDisplay ; 循环直到显示完所有参数
pop edx ; 恢复edx
pop ecx ; 恢复ecx
pop ebx ; 恢复ebx
ret
ShowParams ENDP
上述代码假设 WriteHex
和 WriteChar
过程已定义,用于显示十六进制值和单个字符。代码中首先保存了一些寄存器的值,然后根据传入的参数数量循环显示每个参数的地址和十六进制值,最后恢复寄存器的值并返回。
34、编写一个名为Str_nextword的过程,该过程在字符串中扫描某个分隔符字符的首次出现,并将该分隔符替换为空字节。有两个输入参数:一个指向字符串的指针和分隔符字符。调用后,如果找到了分隔符,则零标志位被设置,EAX包含分隔符之后下一个字符的偏移量。否则,零标志位被清除,EAX未定义。以下示例代码传递了目标字符串的地址和逗号作为分隔符:.data target BYTE “Johnson,Calvin”,0.code INVOKE Str_nextword, ADDR target, ‘,’ jnz notFound
以下是实现 Str_nextwor