汇编语言程序设计与算法实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值