8086 汇编语言从入门到实战:寻址方式 + 经典作业案例深度复盘

发布时间:2026/6/29 17:19:45
8086 汇编语言从入门到实战:寻址方式 + 经典作业案例深度复盘 一、前言很多计算机专业的同学初次接触汇编语言时都会被寄存器、段寻址、各种间接 / 基址变址寻址搞得一头雾水。我们习惯了 Python、C 语言这种高度封装的高级语言不用关心数据存在内存的哪个位置、CPU 如何逐条执行指令而汇编语言相当于一把 “透视镜”让我们直接触摸计算机底层的运行逻辑。本文结合本学期汇编课程的三道经典实验练习题从寄存器基础、内存寻址方式、数组批量处理、数据统计计算四个维度复盘汇编核心知识点同时附上可直接运行的完整代码、踩坑经验总结不管是期末复习、作业参考还是入门学习都可以直接使用。二、汇编前置核心知识点梳理1. 8086 寄存器基础16 位 8086CPU 常用寄存器分为两大类通用寄存器16 位AX、BX、CX、DX、SI、DI、BP、SP其中AX、BX、CX、DX可以拆分为两个 8 位寄存器如AXAH高8位AL低8位用来处理单字节数据。段寄存器16 位CS(代码段)、DS(数据段)、ES(附加段)、SS(栈段)用来存放段基地址程序必须先给DS赋值才能访问自定义数据段里的变量。三种高频寻址方式寻址方式写法示例核心作用寄存器间接寻址[SI]、[DI]用单个寄存器充当内存偏移适合一维数组顺序遍历基址变址寻址[BXSI]、[BXDI]BX做数据块基准起始地址变址寄存器遍历内部元素适合二维表格、多组数据处理相对基址变址寻址[BXSI10H]在基址变址基础上增加固定偏移直接访问多块连续内存区域常用伪指令DB定义字节8 位1 字节适合存放字符、单个 0~255 数值DW定义字16 位2 字节适合存放成绩、工资这类整数DD定义双字32 位4 字节适合超大数值总收入、大数除法场景DUP(n,数据)批量开辟连续内存比如DB 20 DUP(?)一次性申请 20 字节空白内存三、三大经典实战案例详解附完整可运行代码案例 1内存数据批量复制寻址方式基础演练1. 题目需求预先开辟30H字节空白内存从偏移30H开始存放 0~15 共 16 个字节数据将这组数据分别复制到内存偏移00H、10H、20H三块区域练习寄存器间接、基址变址寻址。assume cs:codesg, ds:datadata segment db 30H dup (?)db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15data endscodesg segmentstart:mov ax, datamov ds, axmov si, 30H ;源数据起始偏移mov di, 0 ;第一块目标区域偏移mov bx, 10H ;第二块数据基准偏移mov cx, 10H ;循环16次next: mov al, [si] ;寄存器间接寻址读取源数据mov [di], al ;复制到00H~0FH区域mov [bxdi], al ;基址变址寻址复制到10H~1FH区域mov [bxdi10H], al ;相对基址变址寻址复制到20H~2FH区域inc diinc siloop nextmov ax,4c00hint 21hcodesg endsend start案例 2二维数组求和工资统计1. 题目需求8 名工程师第一行 DW 存储基本工资、第二行 DW 存储绩效工资第三行预留空白 DW计算每位员工总工资存入对应位置寄存器间接寻址assume cs:codesg, ds:datasgdatasg segmentdw 6290, 7230, 2943, 3360, 7469, 6871, 3067, 3086dw 7288, 7160, 5733, 7030, 5281, 6891, 4853, 4539dw 0,0,0,0,0,0,0,0datasg endscodesg segmentstart:mov ax, datasgmov ds, axmov cx, 8mov si, 0L1:mov ax, [si]add ax, [si16]mov [si32], axadd si, 2loop L1mov ax,4c00hint 21hcodesg endsend start案例 3二维成绩表总分统计双层循环 栈段使用1. 题目需求5 名学生每人 4 门课程成绩每条记录第 5 个 DW 用来存储总分使用双层循环累加每一位同学总成绩同时手动初始化栈段练习栈寄存器SS、SP的使用。assume cs:codesg, ds:datasg, ss:stacksgdatasg segmentdw 54, 74, 71, 52, 0dw 68, 54, 93, 95, 0dw 81, 52, 97, 67, 0dw 98, 77, 69, 99, 0dw 79, 71, 69, 73, 0datasg endsstacksg segmentdw 8 dup(0)stacksg endscodesg segmentstart:;栈段初始化mov ax, stacksgmov ss, axmov sp, 16 ;数据段挂载mov ax, datasgmov ds, axmov cx, 5mov bx, 0outer:push cx ;外层循环CX入栈保护避免被内层循环覆盖mov ax, 0mov si, 0mov cx, 4inner:add ax, [bxsi]add si, 2loop innermov [bx8], ax ;总成绩存入每条记录末尾pop cxadd bx, 10 ;单条学生记录5个DW10字节loop outermov ax,4c00hint 21hcodesg endsend start