实验二汇编语言程序结构
4学时
一、实验目的
1.掌握汇编语言程序上机过程。
2.掌握汇编语言结构。
3.学习汇编语言的伪操作。
4.了解汇编程序、连接程序、DOS系统装入和返回功能。
5.掌握用DEBUG调试汇编语言程序的方法
1.伪操作学习
编辑下列源文件:
data          SEGMENT
var0            DB    10101010B,‘TsingHua’
var1          DW  ‘efgh’
var2            DB    -374,-1
var3            DW    -1,9080H
var4            DD    ffeeddccH
data            ENDS
code            SEGMENT
ASSUME  CS:code,DS:data
start:          MOV      DS,data
MOV      CX,var0
LEA      AL,var1
code            ENDS
END  start
汇编该文件,据提示说明出错语句的错误原因。
修改程序中的错误,在DEBUG下查看变量var0~var4在内存中的存放情况。
三、实验说明
1.汇编语言程序的上机过程
(1)建立汇编语言程序源文件。可使用任何一个文本编辑器(如EDIT)编辑源文件,源文件,源文件的扩展名通常取为.asm。
(2)汇编文件,形成目标模块。ML
若文件有语法错误,据错误提示,返回(1),修改源文件。
若无错,则形成.OBJ目标文件和.LST列表文件。
(3)连接目标模块,形成可执行文件。LINK
若有错,据错误提示,返回(1),修改错误。
若无错,则形成.EXE可执行文件和.MAP映像文件。
(4)DOS下直接键入可执行文件名,即可执行该程序。
(5)如运行结果不对,需调试程序,查原因。
返回步骤(1)查看源文件,查错误,修改文件。
若无法通过查看源文件出错误,可在DEBUG下调试.EXE文件,出错误之处,再返回步骤(1)。了解在DEBUG下装入.exe文件的方法,利用在实验一中掌握的调试方法对程序进行调试。
2. 利用DEBUG,学习伪操作的方法。
在DEBUG下查看源程序时,发现.asm源文件指令中用符号表示的变量、标号、过程名等符号地址以及一些由汇编提供的操作符(如SEG,OFFSET等)均被一些确定的数值代替,从而说明,这些用符号表示的地址,经过汇编、连接及装入内存后,都有了具体的选择理地址与之对应,其它的一些伪操作也都在程序执行前已经完成,通过对在DEBUG下查看源程序,对比.asm源文件,可以掌握伪操作的功能。
例:有如下程序段,程序源文件名设为Study.asm:
data        SEGMENT
string      DB‘how are you doing?’,‘$’
D_word      DW      1234h,5678h
Data        ENDS
Code        SEGMENT
ASSUME    CS:code,DS:data
Begin:      PUSH  DS
MOV  AX,0
PUSH  AX
MOV  AX,data
MOV  DS,AX
MOV  DX,OFFSET string
MOV  BL,string
MOV  AH,09H
INT  21H
MOV  AH,4CH
INT  21H
code          ENDS
END begin
经汇编、连接后,形成,在DEBUG下装入此文件,用U查看程序。
D:\> ↙
-
U ↙
12A7:0000 1E        PUSH DS
12A7:0001 B80000    MOV AX,0000
12A7:0004 50        PUSH AX
12A7:0005 B8A512    MOV AX,12A5    ;原为MOV AX,data
12a7:0008 8ED8      MOV DS,AX
12A7:000A BE0000    MOV DX,0000    ;原为MOV SI,OFFSET string 12A7:000D 8A1E0000  MOV BL,[0000]  ;原为MOV BL,string
12A7:0011 B409      MOV AH,09H
12A7:0013 CD21      INT 21H
汇编语言如何编程12A7:0015 B44C      MOV AH,4CH
12A7:0017 CD21      INT 21H
┇;省略与程序部分无关的显示
对照源程序Study.asm,可知:
(1)定义的data段,在内存的段值为12A5H;
(2)伪操作OFFSET的作用是取变量string的偏移地址:
从汇编后操作数OFFSET string由string的偏移值0000代替可知;
(3)变量string是一个直接寻址的操作数:
从程序中操作数string被操作数[0000]代替可知。
(4)用命令D查看12A5H段的内容
—D 12A5:0 L 30 ↙
12A5:0000 48 6F 77 20 61 72 65 20—79 6F 75 20 64 6F 69 6E  How are you doing 12A5:0010 67 20 3F 24 34 12 78 56—00 00 00 00 00 00 00 00  g?$4Xv … … …
12A5:0020 1E B8 00 00 50 B8 A5 12—8E D8 BE 00 00 8A 1E 00    P … … … …
看到存放在内存的字符串‘How are you doing?’,其后存放数值1234H,5678H,存放规则为低地址的内存单元放低字节数据,高地址的内存单元放高字节数据。
(5)用命令R查看当前各寄存器值
—R ↙
AX=0000 BX=0000 CX=0032 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=1295 ES=1295 SS=12A5 CS=12A7 EP=0000 NV UP EI PL NZ NA PO NC 12A7:0000  1E      PUSH  DS
当前DS的值为1295H,并不等于data对应的值12A5H,此时DS的值为程序段前缀所在段值,故程序中若不给DS赋值,使 DS的值等于12A5H,则指令MOV BL,[0000]中的操作数[0000]将不为12A5:0000H指向的值‘H’,而是1295:0H指向的值CDH。
(6)对伪操作功能不清楚的地方,均可通过编写汇编语言程序,经汇编、连接后在DEBUG 下对照查看来掌握。
四、问题思考
1.一个段的大小为多少?一定是64KB吗?如何在DEBUG下查看程序在内存的存放情况?画出数据段在内存的存放情况。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。