在 emu8086 中可以直接编译运行的完整汇编程序,演示数组的定义、遍历、求和、求最大值。

1.程序

cpp 复制代码
; ===================================================
; 程序名称:数组操作演示(求和 & 求最大值)
; 运行环境:emu8086
; 修正:使用 AX 累加,避免溢出
; ===================================================

org 100h              ; COM 文件的起始地址

; 数据段
.data
    ; 定义一个字节数组
    my_array DB 15, 42, 7, 89, 23, 56, 34, 71
    array_len EQU 8    ; 数组长度
    
    sum_msg DB 'Sum: $'
    max_msg DB 13,10,'Max: $'  ; 13,10 是回车换行

.code
start:
    ; 初始化段寄存器(emu8086 需要)
    mov ax, @data
    mov ds, ax
    
    ; ========== 示例1:求数组元素之和(修正版)==========
    xor ax, ax         ; AX = 0(存放累加结果)
    xor bx, bx         ; BX = 0(存放临时变量)
    mov cx, array_len  ; CX = 数组长度(循环计数器)
    mov si, 0          ; SI = 索引(从0开始)
    
sum_loop:
    mov bl, [my_array + si]  ; 将当前字节元素加载到 BL
    add ax, bx               ; 加到 AX(16位累加)
    inc si                   ; 索引+1
    loop sum_loop            ; CX--, 若CX>0则继续
    
    ; 此时 AX 中存放的是正确的和 = 337
    push ax                  ; 保存累加结果
    
    ; 显示 "Sum: "
    mov dx, offset sum_msg
    mov ah, 9
    int 21h
    
    pop ax                   ; 恢复累加结果
    call print_num           ; 调用数字打印子程序
    
    
    ; ========== 示例2:求数组中的最大值 ==========
    mov cx, array_len
    mov si, 0
    mov al, [my_array + si]  ; 先假设第一个元素最大
    inc si                   ; 从第二个元素开始比较
    
max_loop:
    cmp al, [my_array + si]  ; 当前最大值 vs 当前元素
    jge skip_update          ; 如果 al >= 当前元素,跳过更新
    mov al, [my_array + si]  ; 否则更新最大值
skip_update:
    inc si
    loop max_loop
    
    ; 此时 AL 中存放最大值 = 89
    push ax                  ; 保存最大值
    
    ; 显示 "Max: "
    mov dx, offset max_msg
    mov ah, 9
    int 21h
    
    pop ax                   ; 恢复最大值
    xor ah, ah               ; 确保 AH=0
    call print_num           ; 显示最大值
    
    ; 等待按键退出
    mov ah, 0
    int 16h
    
    ; 退出程序
    mov ax, 4c00h
    int 21h


; ===================================================
; 子程序:打印 AX 中的无符号整数(0-65535)
; 输入:AX = 要打印的数值
; 输出:在屏幕上显示十进制数字
; ===================================================
print_num proc
    push ax
    push bx
    push cx
    push dx
    push si
    
    ; 处理特殊情况:数字为0
    or ax, ax
    jnz not_zero
    mov dl, '0'
    mov ah, 2
    int 21h
    jmp print_done
    
not_zero:
    ; 逐位提取数字并压栈
    mov cx, 0          ; 数字位数计数器
    mov bx, 10         ; 除数为10
    
divide_loop:
    xor dx, dx         ; 清零 DX(放余数)
    div bx             ; AX / 10,商在 AX,余数在 DX
    push dx            ; 余数(0-9)压栈保存
    inc cx             ; 位数+1
    or ax, ax          ; 商是否为0?
    jnz divide_loop    ; 不为0则继续
    
    ; 弹出并显示所有数字
print_stack:
    pop dx
    add dl, '0'        ; 转换为 ASCII 字符
    mov ah, 2
    int 21h
    loop print_stack
    
print_done:
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
print_num endp

end start

2.运行结果

相关推荐
Tbisnic14 分钟前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx36 分钟前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
今天AI了吗1 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
风月说与山鬼1 小时前
三、大括号语法
前端·react.js
kyriewen1 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
空堂与归2 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
TELL5212 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
Csvn2 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法