------------恢复内容开始------------
DB\DW\DD说明:
db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1;
dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2;
dd一个双字数据占4个字节单元,读完一个,偏移量加4。
汇编伪指令ORG n作用是定义程序或数据块的起始地址,指示此语句后面的程序或数据块以n为起始地址连续存放在程序存储器中。
(1) 对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
表1 运算符使用说明
运算符 |
使用说明 |
SEG |
返回变量/标号的段值 |
OFFSET |
取变量/标号的偏移地址 |
TYPE |
返回变量类型:字节=1,字=2,双字=4; 取标号类型:NEAR= -1,FAR= -2 |
LENGTH |
返回变量的元素个数 返回外层DUP数值,其他为1 |
SIZE |
返回变量的字节数 SIZE=TYPE*LENGTH |
FLDB DB ?
TABLEA DW 20 DUP(?)
TABLEB DB ‘ABCD’
1) MOV AX, TYPE FLDB
2) MOV AX, TYPE TABLEA
3) MOV CX, LENGTH TABLEA
4) MOV DX, SIZE TABLEA
5) MOV CX, LENGTH TABLEB
结果
|
汇编指令 |
调试所得寄存器值 |
(1) |
MOV AX,TYPE FLDB |
(AX) = 0001H |
(2) |
MOV AX, TYPE TABLEA |
(AX) = 0002H |
(3) |
MOV CX, LENGTH TABLEA |
(CX) = 0014H |
(4) |
MOV DX, SIZE TABLEA |
(DX) = 0028H |
(5) |
MOV CX, LENGTH TABLEB |
(CX) = 0001H |
实验源文件,代码如下
1 ;定义数据段(放变量)------------------ 2 DATA SEGMENT ;定义CNT=80H;CNT DB 10000000B 3 MSG DB 'This is an example.$' 4 ;1. 5 FLDB DB ? 6 TABLEA DW 20 DUP(?) 7 TABLEB DB 'ABCD' 8 9 10 DATA ENDS 11 12 ;代码段------------------ 13 CODE SEGMENT 14 ASSUME CS:CODE,DS:DATA 15 16 17 ;代码段首条指令偏移地址0100H 18 ORG 0100H 19 20 START:MOV AX,DATA ;数据段段地址送AX(不能删) 21 MOV DS,AX ;数据段段地址存入数据段寄存器DS(不能删) 22 23 ;从下面开始编辑自己的代码(Start) 24 ;1. 25 MOV AX,TYPE FLDB 26 MOV AX,TYPE TABLEA 27 MOV CX,LENGTH TABLEA 28 MOV DX,SIZE TABLEA 29 MOV CX,LENGTH TABLEB 30 CODE ENDS 31 END START
我的理解是第一个T获得数据段的地址,依次执行T指令完成各个MOV指令
ARY DB
0,0,3,4 是定义一个叫ary的char型的数组变量,它有4个成员,{0,0,3,4}
用C语言理解的话,就是 char ary[4] = {0,0,3,4};
CNT:操作次数
LEN EQU $-ARRAY
$代表当前地址
$ - ARRAY 代表当前地址与Label之间的距离, 单位byte
整体意思就是将这个差距保存到LEN中
(2) 先自己手工计算,再借助程序调试验证,这里EQU是等值命令。
已知:
ORG 100H
ARY DW 3, 4, 5, 6
CNT EQU $-ARY
DB 7, 8, CNT, 9
则执行指令“MOV AX, ARY+2”和“MOV BX, ARY+10”后,AX=?, BX=?。
与你手工计算结果一致否?
结果
(AX) =0004H |
(BX) =0908H |
实验源文件,代码如下
1 ;定义数据段(放变量)------------------ 2 DATA SEGMENT ;定义CNT=80H;CNT DB 10000000B 3 MSG DB 'This is an example.$' 4 ;2. 5 ORG 100H 6 ARY DW 3, 4, 5, 6 7 CNT EQU $-ARY 8 DB 7, 8, CNT, 9 9 10 DATA ENDS 11 12 ;代码段------------------ 13 CODE SEGMENT 14 ASSUME CS:CODE,DS:DATA 15 16 17 ;代码段首条指令偏移地址0100H 18 ORG 0100H 19 20 START:MOV AX,DATA ;数据段段地址送AX(不能删) 21 MOV DS,AX ;数据段段地址存入数据段寄存器DS(不能删) 22 23 ;从下面开始编辑自己的代码(Start) 24 ;2. 25 MOV AX, ARY+2 26 MOV BX, ARY+10 27 END START
思路图解
ENTRY ; 指定应用程序的入口点
(3) 先手工计算,再借助程序调试验证。
根据下面的指令和伪指令序列:
TAB DW 1, 2, 3, 4, 5, 6
ENTRY EQU 6
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, [BX]
结果
记录1:(AX) = 0004H
实验源文件,代码如下
1 ;定义数据段(放变量)------------------ 2 DATA SEGMENT ;定义CNT=80H;CNT DB 10000000B 3 MSG DB 'This is an example.$' 4 ;2. 5 ORG 100H 6 TAB DW 1, 2, 3, 4, 5, 6 7 ENTRY EQU 6 8 9 10 DATA ENDS 11 12 ;代码段------------------ 13 CODE SEGMENT 14 ASSUME CS:CODE,DS:DATA 15 16 17 ;代码段首条指令偏移地址0100H 18 ORG 0100H 19 20 START:MOV AX,DATA ;数据段段地址送AX(不能删) 21 MOV DS,AX ;数据段段地址存入数据段寄存器DS(不能删) 22 23 ;从下面开始编辑自己的代码(Start) 24 ;3. 25 MOV BX, OFFSET TAB 26 ADD BX, ENTRY 27 MOV AX, [BX] END START
思路图解
(4) 阅读以下示例程序并答题:
请尝试修改以上程序,实现如下所述功能:
1) 在‘Welcome to Masm!’前添加自己的“姓名全拼+学号”显示,如:SunZhiHai209050111 Welcome to Masm!;
2) 显示共4行,前3行与示例程序效果相同,第4行要求效果:红字高亮蓝底闪烁。
实验源文件,代码如下
1 ;定义堆栈段------------------ 2 STACK SEGMENT STACK 3 DB 200 DUP(0) 4 STACK ENDS 5 ;代码段------------------ 6 ASSUME CS:CODE, DS:DATA 7 CODE SEGMENT 8 ;定义数据段(放变量)------------------ 9 DATA SEGMENT 10 DB 'SunJie219350128 Welcome to Masm!' 11 DATA ENDS 12 13 START: MOV AX, DATA ;数据段段地址送AX(不能删) 14 MOV DS, AX ;数据段段地址存入数据段寄存器DS(不能删) 15 16 ;从下面开始编辑自己的代码(Start) 17 18 MOV AX, 0B872H 19 MOV ES, AX 20 21 MOV SI, 0 22 MOV DI, 0 23 MOV CX, 31 ;字符数 24 A: 25 MOV AL, DS:[SI] 26 MOV ES:[DI], AL 27 MOV ES:[DI+160], AL ;一行有160字节 28 MOV ES:[DI+320], AL 29 MOV ES:[DI+480], AL 30 31 MOV AL, 2H ;设置前景和背景颜色 绿字黑底 00000010 32 MOV ES:[DI+1], AL 33 MOV AL, 24H ;设置前景和背景颜色 红字绿底 00100100 34 MOV ES:[DI+161], AL 35 MOV AL, 71H ;设置前景和背景颜色 蓝字白底 01110001 36 MOV ES:[DI+321], AL 37 MOV AL, 9CH ;设置前景和背景颜色 红字高亮蓝底闪烁 10011100 38 MOV ES:[DI+481], AL 39 40 INC DI 41 INC DI 42 INC SI 43 44 LOOP A 45 46 ;显示字符串 47 MOV AH, 4CH 48 INT 21H 49 CODE ENDS 50 END START