汇编与编程实践:数组填充与逻辑实现

19、编写一个应用程序,完成以下操作:(1)用50个随机整数填充一个数组;(2)遍历数组,显示每个值,并统计负值的数量;(3)循环结束后,显示统计数量。注意:Irvine32库中的Random32过程可生成随机整数。

以下是一个可能的汇编代码实现思路:首先,使用 Randomize 过程初始化随机数种子,然后定义一个大小为 50 的 DWORD 类型数组。通过循环 50 次,每次调用 Random32 过程生成随机整数并存储到数组中。接着再次遍历数组,显示每个元素的值,同时检查是否为负数,若是则增加负数计数器。最后,显示负数的统计数量。

代码示例如下:

TITLE Fill Array with Random Integers
INCLUDE Irvine32.inc

.data
array       DWORD 50 DUP(?)
negativeCount DWORD 0
prompt      BYTE  'Array element: ', 0
countMsg    BYTE  'Number of negative values: ', 0

.code
main PROC
    call Randomize ; 初始化随机数种子

    mov ecx, 50     ; 循环50次
    mov esi, 0      ; 数组索引
L1:
    call Random32   ; 生成随机整数
    mov array[esi * 4], eax ; 存储到数组中
    inc esi         ; 索引加1
    loop L1         ; 循环

    mov ecx, 50     ; 再次循环50次
    mov esi, 0      ; 重置数组索引
    mov negativeCount, 0 ; 初始化负数计数器
L2:
    mov eax, array[esi * 4] ; 获取数组元素
    mov edx, OFFSET prompt
    call WriteString ; 显示提示信息
    call WriteInt    ; 显示数组元素
    call Crlf        ; 换行

    cmp eax, 0       ; 检查是否为负数
    jl isNegative    ; 若是负数,跳转到isNegative
    jmp nextElement  ; 否则,继续下一个元素

isNegative:
    inc negativeCount ; 负数计数器加1

nextElement:
    inc esi          ; 索引加1
    loop L2          ; 循环

    mov edx, OFFSET countMsg
    call WriteString ; 显示统计信息提示
    mov eax, negativeCount
    call WriteInt    ; 显示负数统计数量
    call Crlf        ; 换行

    exit
main ENDP
END main

20、使用块结构的 .IF 和 .WHILE 指令,用汇编语言实现以下 C++ 代码。假设所有变量都是 32 位有符号整数:int array[] = {10,60,20,33,72,89,45,65,72,18};int sample = 50;int ArraySize = sizeof array / sizeof sample;int index = 0;int sum = 0;while( index < ArraySize ){if( array[index] <= sample ){ sum += array[index];}index++;}可选:为代码绘制流程图。

以下是使用汇编语言实现上述 C++ 代码的示例,使用了块结构的 .IF .WHILE 指令。假设使用 MASM 汇编器:

.MODEL SMALL
.STACK 100H
.DATA
array   DWORD 10, 60, 20, 33, 72, 89, 45, 65, 72, 18
sample  DWORD 50
ArraySize DWORD ($ - array) / 4
index   DWORD 0
sum     DWORD 0
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    .WHILE index < ArraySize
        MOV EAX, index
        MOV EBX, 4
        MUL EBX
        MOV EBX, EAX
        MOV EAX, [array + EBX]

        .IF EAX <= sample
            ADD sum, EAX
        .ENDIF

        INC index
    .ENDW

    MOV AH, 4CH
    INT 21H
MAIN ENDP

END MAIN

关于绘制流程图,这里无法直接绘制,但可以描述其逻辑:

  1. 开始。
  2. 初始化变量( array sample ArraySize index sum )。
  3. 进入循环判断( index < Arr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值