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或大于30,显示错误消息。
- 使用
CMP和条件跳转指令替代.IF和.ELSEIF指令来判断是否可以注册。 - 根据判断结果显示相应消息。
以下是示例代码框架:
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

最低0.47元/天 解锁文章
12万+

被折叠的 条评论
为什么被折叠?



