0 前言
本文解答王爽《汇编语言》实验5的(5)(6)题
同时给出一些常见问题的解答
以及给出最易犯错的地方:数据类型不匹配的解决方案
1 题目解答
1.1 实验5(5)
1.1.1 题目
将data1和data2段的数据依次相加,结果放入data3段
data1 segmentdb 1,2,3,4,5,6,7,8
data1 endsdata2 segmentdb 1,2,3,4,5,6,7,8
data2 endsdata3 segmentdb 0,0,0,0 ,0,0,0,0
data3 ends
1.1.2 题目解析
- 数据是字节型数据,注意寄存器使用al、ah系列,寻址要+1
8 + 8
存在进位,不过没有超范围,不影响- 此处使用
mov
指令传送数据最方便 - 内存连续的数据,用循环
重要的:程序算法设计(无论多简单,都不能忽视!)
1.1.3 代码
assume ds:data1,ds:data2,ds:data3
data1 segmentdb 1,2,3,4,5,6,7,8 ; 8 + 8 = 10H 一个字节放得下,没事!
data1 endsdata2 segmentdb 1,2,3,4,5,6,7,8
data2 endsdata3 segmentdb 0,0,0,0 ,0,0,0,0
data3 endsassume cs:code
code segment
start:mov ax,data1mov ds,axmov bx,0mov cx,8s:mov al,[bx] ; 这种语法格式,很容易让人忽略【数据类型】,还是AT&T格式好add al,[bx + 10h]mov [bx + 20h],aladd bx,1loop smov ax,04c00hint 21h
code ends
end start
1.1.4 代码注意事项
- 字节型数据,对应使用8位寄存器,不是16位!
- 内存中连续的字节型数据,应该是bx + 1,不是+2
- 可以查一查AT&T格式的x86汇编语言,这种格式,要求操作助记符指明操作数的数据类型,这样一来,你根本不会出错,通常这种格式在Linux操作系统使用。
1.2 实验5(6)
1.2.1 题目
用push指令将data1段的前8个字型数据,逆序放入data2段
data1 segmentdw 1,2,3,4, 5,6,7,8, 9,0ah,0bh,0ch, 0dh,0eh,0fh,0ffh
data1 endsdata2 segmentdw 0,0,0,0, 0,0,0,0
data2 ends
1.2.2 题目解析
- 字型数据,寄存器使用AX系列,连续内存单元访问要 +2
- 逆序,需要使用栈
- 注意栈顶SS:SP的位置和DS:EA的位置
以下是设计模型
算法流程模型不再赘述,只需要
- 将SS:SP和DS:EA指定到对应位置
- 注意要 +2
1.2.3 代码
assume ds:data1,ds:data2
data1 segmentdw 1,2,3,4, 5,6,7,8, 9,0ah,0bh,0ch, 0dh,0eh,0fh,0ffh
data1 endsdata2 segmentdw 0,0,0,0, 0,0,0,0
data2 endsassume cs:code
code segment
start:mov ax,data2mov ss,axmov sp,10hmov ax,data1mov ds,axmov bx,0mov cx,8s:push [bx]add bx,2loop smov ax,04c00hint 21h
code ends
end start
1.3 其他语法的注意事项
对于开头的地方,需要注意,以下是对的:
assume ds:data1,ds:data2,ds:data3
不可以用以下省略!没有这种省略!
assume ds:data1,data2,data3
这表明,段寄存器:段
是一体的,这两个东西的组合,共同表明了段的类型,不可以连写。
2 由题目获得的重要思想观念
2.1 需求分析与程序设计的重要性
任何程序设计,都要先设计,再实现,不要一上来就实现!一上来就敲代码的唯一结果,就是反复返工,浪费时间。
且问题复杂度越大,浪费时间越多,危害也就越大,例如在历史上,软件工程发展初级阶段,放疗设备的软件失误导致多人死亡,这个故事足以让你明白需求分析和设计的重要性。
2.2 把握指令本质,实现灵活应用
这里想强调,push
和pop
指令的本质就是数据传送指令,它们与mov
的本质没有区别,只不过对其的设计的为了专门的堆栈应用而已,但这不代表你只能将其应用于堆栈。
例如最开篇的题目,如果你使用push\pop
指令,是完全可以实现的,不过第一题确实没有必要多此一举。
2.3 避免数据类型匹配错误的解决方案
对于此处的讲解,我单独放了一篇文章,给到你链接
汇编语言程序设计,如何避免数据类型匹配错误