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

112、创建一个过程,返回数组中所有落在范围 j 到 k(包含 j 和 k)内的元素之和。编写一个测试程序,两次调用该过程,传入一个有符号双字数组的指针、数组的大小以及 j 和 k 的值。将总和返回至 EAX 寄存器,并在过程调用之间保存所有其他寄存器的值。

以下是实现该功能的代码示例:

; 创建一个过程,返回数组中所有落在范围 j...k(包含)内的元素之和
; 接收:ESI = 数组偏移量,ECX = 数组元素数量,EDX = j,EBX = k
; 返回:EAX = 范围内元素的总和
SumInRange PROC
    push esi ; 保存 ESI
    push ecx ; 保存 ECX
    push edx ; 保存 EDX
    push ebx ; 保存 EBX
    mov eax, 0 ; 初始化总和为 0

L1:
    mov edi, [esi] ; 获取当前数组元素
    cmp edi, edx ; 比较元素是否 >= j
    jl Next ; 如果 < j,跳过
    cmp edi, ebx ; 比较元素是否 <= k
    jg Next ; 如果 > k,跳过
    add eax, edi ; 元素在范围内,累加到总和

Next:
    add esi, TYPE DWORD ; 指向下一个元素
    loop L1 ; 重复直到遍历完数组

    pop ebx ; 恢复 EBX
    pop edx ; 恢复 EDX
    pop ecx ; 恢复 ECX
    pop esi ; 恢复 ESI
    ret ; 总和在 EAX 中
SumInRange ENDP

; 测试程序
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD

.data
array DWORD 1, 5, 10, 15, 20, 25, 30
arraySize EQU ($ - array) / TYPE DWORD
j1 DWORD 5
k1 DWORD 20
j2 DWORD 10
k2 DWORD 30
theSum1 DWORD ?
theSum2 DWORD ?

.code
main PROC
    ; 第一次调用
    mov esi, OFFSET array ; ESI 指向数组
    mov ecx, arraySize ; ECX = 数组元素数量
    mov edx, j1 ; EDX = j1
    mov ebx, k1 ; EBX = k1
    call SumInRange ; 计算范围内元素的总和
    mov theSum1, eax ; 保存结果

    ; 第二次调用
    mov esi, OFFSET array ; ESI 指向数组
    mov ecx, arraySize ; ECX = 数组元素数量
    mov edx, j2 ; EDX = j2
    mov ebx, k2 ; EBX = k2
    call SumInRange ; 计算范围内元素的总和
    mov theSum2, eax ; 保存结果

    INVOKE ExitProcess, 0
main ENDP

END main

上述代码定义了 SumInRange 过程,用于计算数组中落在指定范围 j k 内的元素之和。测试程序两次调用该过程,分别传入不同的 j k 值,并将结果保存到变量中。

113、提示用户输入平均成绩和学分值。对学分值进行范围检查,学分不能小于1或大于30。如果发现无效输入,显示相应的错误消息。使用CMP和条件跳转指令重写逻辑(而非使用.IF和.ELSEIF指令)来判断该学生是否可以注册。显示评估结果的消息,如“该学生可以注册”或“该学生不能注册”。(此解决方案程序需要Irvine32库)

由于没有足够信息直接给出代码,下面给出实现思路:

  1. 提示用户输入平均成绩和学分值。
  2. 对学分值进行范围检查,若小于1或大于30,显示错误消息。
  3. 使用 CMP 和条件跳转指令替代 .IF .ELSEIF 指令来判断是否可以注册。
  4. 根据判断结果显示相应消息。

以下是示例代码框架:

include Irvine32.inc

.data
gradeAverage WORD ?
credits WORD ?
OkToRegister BYTE ?
ErrorMsg BYTE 'Invalid credits value!', 0
CanRegisterMsg BYTE 'The student can register', 0
CannotRegisterMsg BYTE 'The student cannot register', 0

.code
main PROC
    ; 提示用户输入平均成绩
    mov edx, OFFSET PromptGrade
    call WriteString
    call ReadInt
    mov gradeAverage, ax

    ; 提示用户输入学分
    mov edx, OFFSET PromptCredits
    call WriteString
    call ReadInt
    mov credits, ax

    ; 学分范围检查
    cmp ax, 1
    jl InvalidCre
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值