本文主要是介绍第5/6 汇编伪指令及程序设计(Pro),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
考点1 标号和变量的命名和用法
考点2 伪指令的类型和功能
(1)段定义
(2)数据定义:
考点3 DOS功能调用的应用
考点4 汇编语言程序编程
例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS
考点5 子程序的相关知
考点6 汇编A程序上机过程
.asm
.obj
.exe
总结
考点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 ;段地址 0040ORG 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, 400DISTA 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 SEGMENTVARI = 10 MOD 7 ; 3 MOD 取余 符号定义伪指令 = 和 EQU VAR2 EQU 10H ; 16 符号定义不占用内存VAR3 DB VAR2 DUP (30H) ;在内存当中 从VAR3开始占用内存VAR4 DB 20H,10H,80HDATA 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 SEGMENTORG 0213HDA1 DB 15H, 26H, 37HAD2 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单元的内容是().16HAR DW 1,2
AR2 DW 3C 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 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;定义代码段 和数据段MAIN PROC FAR ;定义了一个过程 起始位置 过程名字 proc 远调(和dos程序)PUSH DS ;DS压栈XOR AX, AX ;把AX 0压栈 可以变成MOV AX ,0PUSH AXMOV AX, DATA ;这两条一定要写,不然CPU找不到段MOV DS, AXMOV BX, OFFSET CMOV AX, [BX]MOV B, AX MOV AX, 2[BX]ADD AX, BMOV A, AXRET ; 一定要有RETMAIN 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,dateMOV DS,AXMOV DS,DATE ;是不合法的 立即数 DATE
(7)ORG微指令
ORG数值表达式
例:ORG 20H
BUF DW 0012H, 5678H
执行MOV AX,BUF+2后,AX的值为
LEA BX,BUF+2后,BX的值为
DATA SEGMENTD1 EQU 0100HORG 2300HD2 DW 35ABH DATA ENDS CODE SEGMENTASSUME CS:CODE, DS:ATA START:MOV AX,SEG D1 /DATaMOV DS, AXMOV BX, 2000HMOV SI, 0200HMOV DX, D1 [BX] [SI] 基址变址相对寻址LEA BX, D1 [BX] [SI] MOV AH, 4CHINT 21Η CODE ENDSEND 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 SEGMENTASSUME CS: CODE, DS: DATA, SS: STACK, ES: EXTRA ;全部进行了指定
START: MOV AX, DATA ;都是立即数MOV DS, AXMOV AX, EXTRAMOV ES, AXMOV AX, STACKMOV SS, AXMOV AH, 4CHINT 21H
CODE ENDSEND START
例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA
START:MOV AX,DATAMOV DS,AX ;XOR AX,AX ;清0MOV AL,X ;MOV AX,XMOV BL,AL ;MUL XMUL BLMOV DX,AXMOV AL,YMOV BL,ALMUL BLADD AX,DXMOV BL,ZDIV BL ;AX/BL——商AL,余AHMOV RESULT,ALMOV AH,4CHINT 21H
CODE ENDSEND START
例2:请写出汇编语言程序实现如下功能:
从键盘输入1~5中的任何一个数,分别在屏幕上显示"1st"、" 2st"、“3st"、”4st"、" 5st"其他字符则显示“*”
利用字符串输出DATA SEGMENT BUF DB 'st','$' ;9号功能定义的字符串 一定要 $符号结束的 显字符串的一种标志 DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE START:MOV AX,DATAMOV DS,AXMOV AX,0MOV AH,01HINT 21HMOV AH,02HCMP AL,'1'JB L1 CMP AL,'5'JA L1MOV DL ,ALINT 21HLEA DX,BUF ;有效地址 一定要给DXMOV AH,09H ;利用9号功能一定要定义INT 21HJMP EXITL1:MOV DL,'*'INT 21HEXIT:MOV AH,4CHINT 21H CODE ENDSEND START
伪指令不占用内存
START 开始
例3:编写完整程序:
将键盘输入的小写字母转换成大写字母并输出显示,直到输入字符'#结束。
如果输入的不是小写字母时要显示错误提示PLEASE INPUT AGAIN!'。
DATA SEGMENTERROR DB '请再一次输入!', ODH, OAH, '$' DATA ENDS CODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX, DATAMOV DS, AXNEXT:MOV AH,1 ;利用1号功能接收字符INT 21H ; CMP AL,'#' ;和#进行比较JE EXIT ;如果是 就EXITCMP AL,'a' ;小于小A JB ERR ERR:LEA DX,ERROR ;返回 再一次输入MOV AH,9INT 21H JMP NEXTEXIT:MOV AH,4CHINT 21HCMP AL,'z'JA ERRSUB AL,20HMOV DL,ALMOV AH,2INT 21HJMP NEXT CODE ENDSEND START
例4:17
编写完整汇编语言程序实现如下功能。
在M单元和N单元分别存有一个8位无符号数36H和95H,
要求比较这两个无符号数,并根据比较结果在屏幕上显示M>N或N>M (假设这两个数不相等) 。
data segmentM DB 36HN DB 95H STR1 DB 'M>N', '$' STR2 DB 'N>M', '$' data ends code segmentassume ds:data,cs:code start: MOV AX,DATA MOV DS,AXMOV AL,MMOV BL,NCMP AL,BLJA L1LEA DX,STR2JMP L2 L1: LEA DX,STR1 L2: MOV AH,09HINT 21HMOV AH,4CH INT 21H code endsend start
例5 :用汇编语言编写程序,从外设71H读取一个数M,判断其值是否在10和20之间,
如果M2 20,则送OFFH给外设73H
如果M<10,则送00H给外设73H;
如果10<M<20,则送88H给外设73H。
CODE SEGMENTASSUME CS:CODE START: IN AL,71HCLCCMP AL,10JC LP1CMP AL,20JC LP2MOV BL,OFFHJMP LP3LP1:MOV BL,0JMP LP3LP2:MOV BL,88HLP3: MOV AL,BLOUT 73H,ALMOV AH,4CHINT 21HCODE ENDSEND START
例6
在内存单元BUF中存放着一个8位有符号二进制数X,试根据关系,用8086汇编语言编写程序求Y值,并将结果存入RESU单元: X大于0时,Y为1; X等于0时,Y为0;X小于0时,Y为-1
data Segmentbuf DB 5result DB ? data ends code Segmentassume cs:code,ds:datastart:mov mov,data mov ds,ax mov AL,buf cmp al,0 JG L1 JZ L2 MOV BL,-1 JMP C3 L1:MOV BL,1JMP L3 L2:MOV BL,0 L3:MOV RESULT,BLMOV AH,4CHINT 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 SEGMENTDATA1 DB 0,1,2,3,4,5,6,7,8,9 ;定义10个无符号数DATA2 DB ? DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,DATA1MOV AL,[BX]TEST AL,01HJZ 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 Segmentn DW ?sum DW ?
Datas Ends
Stack Segment PARA Stack 'stack'DW 200 DUP(?)
Stack Ends
Codes Segment
Main Proc FARAssume CS: Codes, DS: Datas, SS: StackStart:PUSH DS ;AX=0;BX=0MOV AX,0PUSH AXMOV AX,DatasMOV DS,AX BX+1----xMOV AX,0MOV BX,0
LOOPT: INC BX AX=AX+BXADD AX,BXCMP AX,1000 AX=<1000JBE LOOPTMOV n,BX ;否 给NMOV sum,AX sum——axRET
Main Endp end
Codes EndsEnd Start————————————————————————
循环直到大于1000时停止循环
考点6 汇编A程序上机过程
.asm
.obj
.exe
总结
标号和变量的命名和用法
伪指令的类型和功能
汇编语言程序编程
汇编程序上机调试过程
这篇关于第5/6 汇编伪指令及程序设计(Pro)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!