第5/6 汇编伪指令及程序设计(Pro)
目录
例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS
考点1 标号和变量的命名和用法
1.定义
变量:存储单元中数据的地址。
Str 内存单元的首地址
变量名:在程序运行中随时可以通过变量名访问内存
;变量名 内容
变量的三个属性:段属性、偏移属性、类型{DB,DW,DD}属性
地址
变量名伪指令 表达式1,表达式2,
标号:存储单元中指令的地址。
是指令性语句存放在丙存的地址的符号表示,
常用于指令的转移和子程序调用。
标号有三个属性:
段地址、偏移地址和类型(NEAR、 FAR)。
标号使用格式:
标号:指令语句
2.命名规则由字母
(大/小写):数字及特殊符号(_$?@%)组成,
第一个字符不能是数字
一个源程序中,用户定义的标示符必须
合法: abc, HAO,_100, %123, x_1,
不合法: #123,*100, 2019Y,1_2, ADD, BX
(保留字不能用)
汇编语言基础标识符由长度不超过31个字符的字符串组成。
考点2 伪指令的类型和功能
在汇编过程中不产生指令码,只用来表示汇编程序如何汇编的指令是()。
A. 汇编指令B.机器指令
c. 伪指令
D. 宏指令
(1)段定义
{一个完整的汇编程序都要有段
cpu内部 DS,CS,SS,ES 保存的内存单元的首地址
内存保存程序 4个段构成 }
段名 Segment [定位类型] [组合类型] [ '类别' ]
段名 ENDS段的属性:
stack Segment PARA STACK 'stack'
段名 Segment [定位类型] [组合类型] ['类别'] {题干中如果不要求 ,[] 都可以省略}
定位类型:段起始边界对内存空间的要求,
PAGE、 PARA、 WORD、 BYTE。{页,节,字,字节}
PARA为隐含的定位方式,段首址的低4位为0{二进制 四位 十六进制 1位},即“节”边界。
组合类型:指示段与段之间怎样连接和定位。
一般有PUBLIC、STACK、 NONE默认。
类别:是用单引号括起来的字符串,类别相同的放在连续的存储区例如'CODE'、 'STACK' 。
定位参数
通知连接程序,逻辑段的目标代码在存储器中将怎么存放。
4种方式
(1)BYTE,逻辑段可以从任意地址处开始存放。
(2) WORD,逻辑段须从偶地址开始存放。
(3) PARA,逻辑段须从一个能被16整除地址开始存放。
(4) PAGE,逻辑须段从一个能被256整除地址开始存放。
组合参数
不同源程序中,同名程序段的连接方式。
PUBLIC:通知链接程序,把不同模块中具有PUBLIC属性的同名段,在满足定位方式的前提下,组成一个逻辑段。
STACK:把不同模块中具有STACK属性的同名段链接成一个大的堆栈段。链接后堆栈段的空间是链接前各模块预留堆栈空间之和。
AT:逻辑段在定位时,其段基址等于表达式给出的值。AT属性常和ORG伪指令配合。
Dseg SEGMENT AT 0040H ;段地址 0040 ORG 0017H ;有效地址 Tmp DB ? Dseg ENDS
AT参数不能在代码段中使用。 CS:IP CPU指令
缺省:该段是一个独立的段,不进行链接。
类别
数据段—‘Data’
代码段——‘Code’
堆栈段—‘Stack’
段定义举例
Dseg Segment 'data’
Buf db 'l am a student','$'
Dseg Ends
相邻段地址之间的最小距离为( )。
A、16个字节
B、64K字节
C、1K字节
D、256字节
DAT SEGMENT STCK 'STACK'
DW 100 DUP(0)
DATA ENDS
此处定义的含义是()。
A.定义100个字节的堆栈段
B.定义100个字节的数据段
c.定义200个字节的堆栈段
D.定义200个字节的数据段
(2)数据定义:
简答变量的三个属性是什么?
段属性:所在段的段地址
偏移属性:段内偏移地址
类型属性:每个数据项的字节数。
比如,DB类型值为1,
DW类型值为2,
DD类型值为4。
数值回送运算符分别是SEG, OFFSET, TYPE。
DB、DW、DD的区别
例1:在数据定义中,定义字符串时,应使用的伪指令是()
A. DB B. DW C. DD D.DQ
————————————————————————————————————————STR DB ‘abcde’
STR DB ’a‘‘b’‘c’‘d’’e'
例2.在BUF DB 2 DUP (0,0,30H,0,30H )定义的数据单元中,能够成为3000H的字存储单元有d多少个
如果有以下定义域句
BVAR DB 101B,7, 'D' ,OFH,-1,2×56,
则BVAR+4内存单元中的字节内容是
例4:下列变量各占多少字节?
A1 DW 23H,5876H
A2 DB 3 DUP (?),OAH,ODH, '$'
A3 D 5 DUP(1234H, 567890H)
A4 DB 4 DUP(3 DUP(1, 2,ABC))
DB DW S1 DB `a'
S2 DBU 'a'
S3 DB ‘ab’
S4 DW ’ ab‘
S5 DB 'abc'
S6 DW `abc' X
例5:执行下列指令后, AX寄存器的内容是什么?
TABLE DW , 100, 200, 300, 400 DISTA DW 6
(1) MOV BX, OFFSET TABLE
ADD BX, DISTA
MOV AX, [BX]
(2) LEA BX,TABLE
MOV AX, 2[BX]
(3) MOV SI,
4MOV BX, OFFSET TABLE
MOV AX, [BX][SI]
(4) MOV BX, DISTA
MOV AX, TABLE[BX]
300 100 200 300
下列指令执行后,AX= 4141H DX= 6162H
B1 DB 'ABC'
W1 DW 'ab'
.....
MOV AL,B1
MOV AH,B1
MOV DX,W1
——————————————————————————
与字定义不同的是 W2 DW ,'a','b'
0061,0062
w1 dw 'ab' 一个字 占用两个字节
w2 dw 'a','b' 两个字 占用 4 个字节
S1 12345678
S2 0012003400560078
总结DB、DW、DD
请分别用DB,DW、 DD伪指令写出在BUF开始的连续8个单元中依次存放数据:
11H、22H、33H、44H、55H、66H、77H、88H的数据定义语句。
11 22 33 44 55 66 77 88 s1 db = 11,22,33,44,55,66,77,88
s1 dw = 2211,4433,6655,8877
s1 dd = 44332211,88776655
已知BX=2,指出下列程序执行后AL寄存器的内容。
DATA SEGMENT VARI = 10 MOD 7 ; 3 MOD 取余 符号定义伪指令 = 和 EQU VAR2 EQU 10H ; 16 符号定义不占用内存 VAR3 DB VAR2 DUP (30H) ;在内存当中 从VAR3开始占用内存 VAR4 DB 20H,10H,80H DATA ENDS
(1) MOV AL, VARI ;AL=
(2) MOV AL ,VAR2 ;AL=
(3) MOV AL , VAR3 ;AL=
(4) MOV AL, VAR4 [BX] ;AL=CE
BUF DW 10 DUP(3 DUP(2,10H),3,5)
上述语句汇编后,为变量BUF分配的存储单元字节数是()
A.10B.80C.100D.160
已定又数据段如下。能使AX中数据为偶数的语句是()
DATA SEGMENT ORG 0213H DA1 DB 15H, 26H, 37H AD2 DW DA1 DATA ENDS
A. MOV AX, WORD PTR DA1
B. MOV AL, DA1 +2
C. MOV AL, BYTE PTR AD2+1
D. MOV AX, WORD PTR DA1+1专接本INCE
ARY DW 10 DUP (?) ;定义了一个字变量 10个空 ........ MOV AL, TYPE ARY ;类型属性 MOV BL, LENGTH ARY ;长度属性 MOV CL, SIZE ARY ;大小属性
上述指令执行后的AL=2 , BL= 10 CL=20
Length:用于变量的前面,返回数组变量的元素个数,即返回
DUP ()最外层的数值,
没有DUP,则返回1。G
SIZE:返回数组变量所占的总字节数
SIZE=leng*type10 2
已知 VAR DW 1,2, $+2,5,6若汇编时VAR分配的偏移地
址是0010H,则汇编后0014H单元的内容是().
16H
AR DW 1,2
AR2 DW 3
C equ $-var
s equ var2-var
0014-0010 S=4
(3)符号定义
符号定义EQU不占用内存空间
{
立即数寻址
不占内存
}
1段定义:ends
2 数据:db dw dd
PTR,$,TYPE
length
size
dup,?
————————————————————END ;源程序的结束
ENDS ;段的结束
ENDP ; 过程的结束
ENDM ; 宏指令的结束
:(4)过程定义
过程的属性:near,far
过程名 proc [ near,far ] ;省略的话 默认是 近 ,如果用 调用远的话,后面需要加far
过程名 endp ; p对应前面过程的保留字 结束的微指令 end
(5) 程序结束 END
源程序的结束
DATA SEGMENT A DW O ;定义变量 B DW O C DW 100,20,50 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ;定义代码段 和数据段 MAIN PROC FAR ;定义了一个过程 起始位置 过程名字 proc 远调(和dos程序) PUSH DS ;DS压栈 XOR AX, AX ;把AX 0压栈 可以变成MOV AX ,0 PUSH AX MOV AX, DATA ;这两条一定要写,不然CPU找不到段 MOV DS, AX MOV BX, OFFSET C MOV AX, [BX] MOV B, AX MOV AX, 2[BX] ADD AX, B MOV A, AX RET ; 一定要有RET MAIN ENDP ;过程结束位置 CODE ENDS ;段结束 END ;源程序的结束
没有ORG起始地址 默认从0地址开始
有ORG 从指定的位置开始
call Z1 proc
push ax
push bx
.........
pop bx
pop ax
ret ;自动弹出断点
Z1 ENDP
INT 21H ;psw cs,ip
inet ;IP CS PSW
————————————————————
CALL Z1: 压的是 CS;IP
段间 CS
段内 IP
中断调用 和 子程序调用的区别
(6)ASSUME
关联段名
指定段寄存器与段名关联
必须由用户在程序开始时编写代码完成装入。
cs:code ;指定带代码段 ds: date ;指定到数据段 。。。。。。。 MOV AX,date MOV DS,AX MOV DS,DATE ;是不合法的 立即数 DATE
(7)ORG微指令
ORG数值表达式
例:ORG 20H
BUF DW 0012H, 5678H
执行MOV AX,BUF+2后,AX的值为
LEA BX,BUF+2后,BX的值为
DATA SEGMENT D1 EQU 0100H ORG 2300H D2 DW 35ABH DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:ATA START:MOV AX,SEG D1 /DATa MOV DS, AX MOV BX, 2000H MOV SI, 0200H MOV DX, D1 [BX] [SI] 基址变址相对寻址 LEA BX, D1 [BX] [SI] MOV AH, 4CH INT 21Η CODE ENDS END START —————————————————— DX=35ABH BX=2300
考点3 DOS功能调用的应用
INT 21H
{MOV AH,1 ;键盘接收
MOV AH,2 ;屏幕显示单个字符
MOV AH,9 ;屏幕显示字符串
MO AH,4CH ;返回DOS环境
}
功能都在 AH中
考点4 汇编语言程序编程
1.汇编程序注意事项:
每行最多4个组成部分;
双操作数时,中间不能丢掉逗号;
程序至少有一个代码段;
结束程序指令并返回操作系统的方法有两种:
PUSH DS
XOR AX,AX
PUSH AX
.....
RET
MOV AH,4CH
INT 21H
2.汇编语言源程序的基本格式:
DATA SEGMENT
DATA ENDS
EXTRA SEGMENT
EXTRA ENDS
STACK SEGMENT PARA STACK
STACK ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA, SS: STACK, ES: EXTRA ;全部进行了指定
START: MOV AX, DATA ;都是立即数
MOV DS, AX
MOV AX, EXTRA
MOV ES, AX
MOV AX, STACK
MOV SS, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END START
例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX ;XOR AX,AX ;清0
MOV AL,X ;MOV AX,X
MOV BL,AL ;MUL X
MUL BLMOV DX,AX
MOV AL,Y
MOV BL,AL
MUL BL
ADD AX,DX
MOV BL,Z
DIV BL ;AX/BL——商AL,余AH
MOV RESULT,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
例2:请写出汇编语言程序实现如下功能:
从键盘输入1~5中的任何一个数,分别在屏幕上显示"1st"、" 2st"、“3st"、”4st"、" 5st"其他字符则显示“*”
利用字符串输出DATA SEGMENT BUF DB 'st','$' ;9号功能定义的字符串 一定要 $符号结束的 显字符串的一种标志 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV AH,01H INT 21H MOV AH,02H CMP AL,'1' JB L1 CMP AL,'5' JA L1 MOV DL ,AL INT 21H LEA DX,BUF ;有效地址 一定要给DX MOV AH,09H ;利用9号功能一定要定义 INT 21H JMP EXIT L1:MOV DL,'*' INT 21H EXIT:MOV AH,4CH INT 21H CODE ENDS END START
伪指令不占用内存
START 开始
例3:编写完整程序:
将键盘输入的小写字母转换成大写字母并输出显示,直到输入字符'#结束。
如果输入的不是小写字母时要显示错误提示PLEASE INPUT AGAIN!'。
DATA SEGMENT ERROR DB '请再一次输入!', ODH, OAH, '$' DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX NEXT:MOV AH,1 ;利用1号功能接收字符 INT 21H ; CMP AL,'#' ;和#进行比较 JE EXIT ;如果是 就EXIT CMP AL,'a' ;小于小A JB ERR ERR:LEA DX,ERROR ;返回 再一次输入 MOV AH,9 INT 21H JMP NEXT EXIT:MOV AH,4CH INT 21H CMP AL,'z' JA ERR SUB AL,20H MOV DL,AL MOV AH,2 INT 21H JMP NEXT CODE ENDS END START
例4:17
编写完整汇编语言程序实现如下功能。
在M单元和N单元分别存有一个8位无符号数36H和95H,
要求比较这两个无符号数,并根据比较结果在屏幕上显示M>N或N>M (假设这两个数不相等) 。
data segment M DB 36H N DB 95H STR1 DB 'M>N', '$' STR2 DB 'N>M', '$' data ends code segment assume ds:data,cs:code start: MOV AX,DATA MOV DS,AX MOV AL,M MOV BL,N CMP AL,BL JA L1 LEA DX,STR2 JMP L2 L1: LEA DX,STR1 L2: MOV AH,09H INT 21H MOV AH,4CH INT 21H code ends end start
例5 :用汇编语言编写程序,从外设71H读取一个数M,判断其值是否在10和20之间,
如果M2 20,则送OFFH给外设73H
如果M<10,则送00H给外设73H;
如果10<M<20,则送88H给外设73H。
CODE SEGMENT ASSUME CS:CODE START: IN AL,71H CLC CMP AL,10 JC LP1 CMP AL,20 JC LP2 MOV BL,OFFH JMP LP3 LP1:MOV BL,0 JMP LP3 LP2:MOV BL,88H LP3: MOV AL,BL OUT 73H,AL MOV AH,4CH INT 21H CODE ENDS END START
例6
在内存单元BUF中存放着一个8位有符号二进制数X,试根据关系,用8086汇编语言编写程序求Y值,并将结果存入RESU单元: X大于0时,Y为1; X等于0时,Y为0;X小于0时,Y为-1
data Segment buf DB 5 result DB ? data ends code Segment assume cs:code,ds:data start:mov mov,data mov ds,ax mov AL,buf cmp al,0 JG L1 JZ L2 MOV BL,-1 JMP C3 L1:MOV BL,1 JMP L3 L2:MOV BL,0 L3:MOV RESULT,BL MOV AH,4CH INT 21H CODE ENAS END STANT
自内存0500H单元开始,保存有10个无符号字节类型的数据,分别为45H, 89H, 11H, 26H, 8AH、 9FH, 78H、 OAAH, 18H、 ЗEH请编写程序,求这10个数之和。
要求:
(1)用8位二进制数运算方式进行计算。
(2)结果用两个字节表示。
(3)把结果存放到050AH和050BH单元,且高字节放在050BH单元。
在DATA1单元开始存放10个无符号字节数据,编程求10个中偶数的个数,将结果存于DATA2单元。
DATA SEGMENT DATA1 DB 0,1,2,3,4,5,6,7,8,9 ;定义10个无符号数 DATA2 DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,DATA1 MOV AL,[BX] TEST AL,01H JZ L1
考点5 子程序的相关知
顺序:(X^2+Y^2)/子
{字符串
}
分之{
比较 小转大
分段函数
}
循环{
从1加到100
10个数求和
10个中统计 偶数 正/负 0的个数
}
X>=90
90>x>=80
80>x>=70
70>x>=60
60>x>=50
例:写出下列程序的功能,并画出程序框图
Datas Segment
n DW ?
sum DW ?
Datas Ends
Stack Segment PARA Stack 'stack'
DW 200 DUP(?)
Stack Ends
Codes Segment
Main Proc FAR
Assume CS: Codes, DS: Datas, SS: Stack
Start:PUSH DS ;AX=0;BX=0
MOV AX,0
PUSH AX
MOV AX,Datas
MOV DS,AX BX+1----x
MOV AX,0
MOV BX,0
LOOPT: INC BX AX=AX+BX
ADD AX,BX
CMP AX,1000 AX=<1000
JBE LOOPT
MOV n,BX ;否 给N
MOV sum,AX sum——ax
RET
Main Endp end
Codes Ends
End Start
————————————————————————
循环直到大于1000时停止循环
考点6 汇编A程序上机过程
.asm
.obj
.exe
总结
标号和变量的命名和用法
伪指令的类型和功能
汇编语言程序编程
汇编程序上机调试过程