在 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.运行结果

相关推荐
JianZhen✓1 小时前
2026前端高频面试题总结(Vue/JS/网络/Webpack/性能优化/手写)
前端·javascript·vue.js
Jinkxs2 小时前
LoadBalancer- 常见负载均衡算法:轮询 / 加权轮询 / 最少连接等基础实现
运维·算法·负载均衡
里欧跑得慢2 小时前
Flutter 主题管理:构建一致的用户界面
前端·css·flutter·web
Brilliantwxx2 小时前
【C++】认识vector(概念+题目OJ)
开发语言·c++·笔记·算法
龙猫里的小梅啊2 小时前
CSS(八)CSS显示模式display属性
前端·css·css3
逻辑驱动的ken2 小时前
Java高频面试考点场景题22
java·开发语言·jvm·面试·职场和发展·求职招聘·春招
雨季mo浅忆2 小时前
第二项目重新梳理
前端·面试
星光开发者2 小时前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
枫叶丹42 小时前
【HarmonyOS 6.0】Core File Kit:端云文件版本管理能力解析与实践
开发语言·华为·harmonyos