? 汇编程序功能
伪操作
汇编语言程序格式
汇编语言程序的上机过程第 4章 汇编语言程序格式
1,程序运行步骤及生成的文件
myfile.asm
编辑程序汇编程序连接程序
myfile.crf
otherfiles.obj
myfile.lst
myfile.obj
myfile.map
myfile.exe
建立,运行汇编语言程序
C>EDIT MYFILE.ASM
C>MASM MYFILE.ASM
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981,1988.All rights reserved.
Object filename [MYFILE.OBJ]:
Source listing [NUL.LST],MYFILE.LST
Cross-reference [NUL.CRF]:
47962 + 413345Bytes symbol space free
0 Warning Errors
0 Severe Errors
C>LINK MYFILE.OBJ
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1983-1988.All rights reserved.
Run File [MYFILE.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK,warning L4021,no stack segment
C>MYFILE
2,汇编程序功能汇编程序的主要功能:
检查源程序,给出出错信息。
产生目标文件 (.obj)和列表文件 (.lst)。
展开宏指令。
3,伪操作(伪指令)
伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择,存储模式定义,数据定义,
存储器分配,指示程序开始结束等功能 。
处理器选择伪操作
段定义伪操作
程序开始和结束伪操作
数据定义及存储器分配伪操作
表达式赋值伪操作
地址计数器与对准伪操作
基数控制伪操作
Directives
.8086 选择 8086 指令系统
.286 选择 80286 指令系统
.286P 选择保护模式下的 80286 指令系统
.386 选择 80386 指令系统
.386P 选择保护模式下的 80386 指令系统
.486 选择 80486 指令系统
.486P 选择保护模式下的 80486 指令系统
.586 选择 Pentium 指令系统
.586P 选择保护模式下的 Pentium 指令系统
◆ 处理器选择伪操作:
◆ 段定义伪操作:
完整的段定义格式
data segment ; 定义数据段
…
data ends;----------------------------------------
extra segment ; 定义附加段
…
extra ends;----------------------------------------
code segment ; 定义代码段
assume cs:code,ds:data,es:extra
start,
mov ax,data
mov ds,ax ; 段地址? 段寄存器
…
code ends
end start
……
code segment
main proc far
assume ……
start:
push ds
mov ax,0
push ax
……
ret
main endp
code ends
end start
……
code segment
main proc far
assume ……
start:
……
……
mov ax,4c00h
int 21h
main endp
code ends
end start
段名 SEGMENT [定位类型 ] [组合类型 ] [使用类型 ] [?类别
’ ]
……
…… ; 语句序列段名 ENDS
(1) 定位类型 align_type (p120)
PARA BYTE WORD DWORD PAGE
(2) 组合类型 combine_type
PRIVATE PUBLIC COMMON STACK AT exp
(3) 使用类型 use_type
USE16 USE32
(4) 类别 ‘ class’
存储模式与简化段定义伪操作
(1) MODEL 伪操作 (p121)
.MODEL 存储模式 [,语言类型 ] [,操作系统类型 ] [,堆栈选项 ]
存储模式,tiny small medium compact large
huge flat
.model small
.stack 100H
.data
……
.code
.startup
……
.exit 0
end
(2) 简化的段定义伪操作 (p122)
.code [name]
.data
.data?
.fardata [name]
.fardata? [name]
.const
.stack [size]
.model small
.data
……
.code
.startup(P127)
……
.exit 0(P127)
end
.model small
.data
……
.code
start,mov ax,@data
mov ds,ax
……
mov ax,4c00h
int 21h
end start.model small
.const
……
.data
……
.code
start,mov ax,DGROUP
mov ds,ax
……
mov ax,4c00h
int 21h
end start
段组定义伪操作 (p126)
dseg1 segment word public ‘data’
……
dseg1 ends
dseg2 segment word public ‘data’
……
dseg2 ends
datagroup group dseg1,dseg2
cseg segment para public ‘code’
assume cs:cseg,ds:datagroup
start:
mov ax,datagroup
mov ds,ax
……
mov ax,4c00h
int 21h
cseg ends
end start
data1 segment word
const1 dw 100
data1 ends
data2 segment word
var1 dw?
data2 ends
datagroup group data1,data2
code segment
assume cs:code,ds:datagroup
mov ax,datagroup
mov ds,ax
mov ax,const1
mov var1,ax
…
mov ax,4c00h
int 21h
code ends
end start
TITLE text
NAME module_name
END [ label ]
,STARTUP
,EXIT [ return_value ]
◆ 程序开始和结束伪操作 (p126)
◆ 数据定义及存储器分配伪操作:
[变量 ] 助记符 操作数 [,操作数,… ] [ ; 注释 ]
助记符,DB DW DD DF DQ DT
DATA_BYTE DB 10,4,10H,?
DATA_WORD DW 100,100H,-5,?
-
0AH
04H
10H
-
64H
00H
00H
01H
FBH
FFH
-
DATA_BYTE?
DATA_WORD?
例:
ARRAY DB ‘HELLO’
DB ‘AB’
DW ‘AB’
48H
45H
4CH
4CH
4FH
41H
42H
42H
41H
ARRAY?
PAR1 DW 100,200
PAR2 DW 300,400
ADDR_TABLE DW PAR1,PAR2
VAR DB 100 DUP (?)
DB 2 DUP (0,2 DUP(1,2),3)
OPER1 DB?,?
OPER2 DW?,?
……
MOV OPER1,0 ;字节指令
MOV OPER2,0 ;字指令
OPER1 DB 1,2
OPER2 DW 1234H,5678H
……
MOV AX,OPER1+1 ×
MOV AL,OPER2 × 类型不匹配
MOV AX,WORD PTR OPER1+1
MOV AL,BYTE PTR OPER2
(AX)=3402H (AL)=34H
BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP (?)
tos LABEL WORD
LABEL 伪操作,name LABEL type
BYTE_ARRAY?
WORD_ARRAY?
tos?
50字
0064H
◆ 表达式赋值伪操作:
表达式名 EQU 表达式
ALPHA EQU 9
BETA EQU ALPHA+18
BB EQU [BP+8]
,=,伪操作 ( 允许重复定义 )
……
EMP = 7
……
EMP = EMP+1
……
◆ 地址计数器与对准伪操作:
地址计数器 $,保存当前正在汇编的指令的地址
ORG $+8 ; 跳过 8个字节的存储区
JNE $+6 ; 转向地址是 JNE 的首址 +6
JMP $+2 ;转向下一条指令
$ 用在伪操作的参数字段:
表示地址计数器的当前值
ARRAY DW 1,2,$+4,3,4,$+4
00H
01H
00H
02H
00H
7CH
00H
03H
00H
04H
00H
82H
ARRAY?
007E
0078
0074
ORG 伪操作:设置当前地址计数器的值
SEG1 SEGMENT
ORG 10
VAR1 DW 1234H
ORG 20
VAR2 DW 5678H
ORG $+8
VAR3 DW 1357H
SEG1 ENDS
BUFFER LABEL BYTE
ORG $+8
BUFFER DB 8 DUP (?)
ORG 100H
START,……
B DW 2 DUP (?)
ALIGN boundary:使下一地址从指定的
boundary倍数开始 )
ALIGN 4
ALIGN 2 ; EVEN
EVEN,使下一地址从偶地址开始
A DB ‘morning’
EVEN
◆ 基数控制伪操作:
,RADIX 表达式 ; 规定无标记数的数制
MOV BX,0FFH
MOV BX,178
.RADIX 16
MOV BX,0FF
MOV BX,178D
3,汇编语言程序格式标号 指令 寄存器 说明程序或语句变量 伪指令 标号 的功能宏指令 变量常数表达式源程序的每条语句可表示为:
[名字 ] 操作 操作数 [; 注释 ]
标号 /变量,段值、偏移量、类型三种属性表达式,数字表达式 地址表达式表达式操作符:
(1) 算术操作符,?,?,?,?,Mod
VIDEO_BUF DB 25*80*2 DUP(?)
ARRAY DW 1,2,3,4,5,6,7
ARYEND DW?
MOV CX,(ARYEND-ARRAY)/2
ADD AX,BLOCK+2 ; 符号地址?常数 有意义; 时意义不明确
MOV AX,BX+1 ;?
MOV AX,[BX+1] ; 寄存器相对寻址
OPR1 EQU 25 ; 00011001B
OPR2 EQU 7 ; 00000111B
AND AX,OPR1 AND OPR2
(2) 逻辑和移位操作符,AND,OR,XOR、
NOT,SHL,SHR; AND AX,1
IN AL,PORT_VAL ;61H
OUT PORT_VAL AND 0FEH,AL ;60H
MOV AX,0FFFFH SHL 2 ; MOV AX,0FFFCH
(3) 关系操作符,EQ,NE,LT,LE、
GT,GE
计算结果为 逻辑值,真 0FFFFH
假 0000H
X,……
……
Y,……
若?128 (真 ) 汇编结果,MOV FID,-1
若?128 (假 ) 汇编结果,MOV FID,0
MOV FID,(OFFSET Y - OFFSET X) LE 128
(4) 数值回送操作符,OFFSET,SEG、
TYPE,LENGTH,SIZE
SIZE 变量功能,LENGTH * TYPE
OFFSET/ SEG 变量 / 标号功能:回送变量或标号的偏址 / 段址
TYPE 变量 / 标号 / 常数
DB DW DD DF DQ DT NEAR FAR 常数
1 2 4 6 8 10 -1 -2 0
LENGTH 变量功能:回送由 DUP定义的 变量的单元数,其它情况回送 1
ARRAY DW 100 DUP (?)
TABLE DB ‘ABCD’
ADD SI,TYPE ARRAY ; ADD SI,2
ADD SI,TYPE TABLE ; ADD SI,1
MOV CX,LENGTH ARRAY ; MOV CX,100
MOV CX,LENGTH TABLE ; MOV CX,1
MOV CX,SIZE ARRAY ; MOV CX,200
MOV CX,SIZE TABLE ; MOV CX,1
(5) 属性操作符,PTR、段操作符,SHORT,THIS、
HIGH,LOW,HIGHWORD,LOWWORD
HIGH和 LOW CONS EQU 1234H
MOV AH,HIGH CONS
MOV AL,LOW CONS
类型 PTR 表达式 MOV WORD PTR [BX],5
段操作符 MOV ES,[BX],AL
SHORT 标号 JMP SHORT NEXT
THIS 类型 TA EQU THIS BYTE
TD DW 1234H
NEXT EQU THIS FAR
MOV AX,2
4,汇编语言程序的上机过程
.model tiny
.code
org 100h
begin,jmp main;************************
num1 dw 1199H
num2 dw 1166H
sum dw?;************************
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
end begin
code segment 'code'
assume cs:code,ds:code,ss:code,es:code
org 100H
begin,jmp main
num1 dw 1199H
num2 dw 1166H
sum dw?
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
code ends
end begin
第 4章作业
Page 155 4.15 4.16
4.5
4.8 4.12 4.14
4.17
伪操作
汇编语言程序格式
汇编语言程序的上机过程第 4章 汇编语言程序格式
1,程序运行步骤及生成的文件
myfile.asm
编辑程序汇编程序连接程序
myfile.crf
otherfiles.obj
myfile.lst
myfile.obj
myfile.map
myfile.exe
建立,运行汇编语言程序
C>EDIT MYFILE.ASM
C>MASM MYFILE.ASM
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981,1988.All rights reserved.
Object filename [MYFILE.OBJ]:
Source listing [NUL.LST],MYFILE.LST
Cross-reference [NUL.CRF]:
47962 + 413345Bytes symbol space free
0 Warning Errors
0 Severe Errors
C>LINK MYFILE.OBJ
Microsoft (R) Overlay Linker Version 3.64
Copyright (C) Microsoft Corp 1983-1988.All rights reserved.
Run File [MYFILE.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK,warning L4021,no stack segment
C>MYFILE
2,汇编程序功能汇编程序的主要功能:
检查源程序,给出出错信息。
产生目标文件 (.obj)和列表文件 (.lst)。
展开宏指令。
3,伪操作(伪指令)
伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择,存储模式定义,数据定义,
存储器分配,指示程序开始结束等功能 。
处理器选择伪操作
段定义伪操作
程序开始和结束伪操作
数据定义及存储器分配伪操作
表达式赋值伪操作
地址计数器与对准伪操作
基数控制伪操作
Directives
.8086 选择 8086 指令系统
.286 选择 80286 指令系统
.286P 选择保护模式下的 80286 指令系统
.386 选择 80386 指令系统
.386P 选择保护模式下的 80386 指令系统
.486 选择 80486 指令系统
.486P 选择保护模式下的 80486 指令系统
.586 选择 Pentium 指令系统
.586P 选择保护模式下的 Pentium 指令系统
◆ 处理器选择伪操作:
◆ 段定义伪操作:
完整的段定义格式
data segment ; 定义数据段
…
data ends;----------------------------------------
extra segment ; 定义附加段
…
extra ends;----------------------------------------
code segment ; 定义代码段
assume cs:code,ds:data,es:extra
start,
mov ax,data
mov ds,ax ; 段地址? 段寄存器
…
code ends
end start
……
code segment
main proc far
assume ……
start:
push ds
mov ax,0
push ax
……
ret
main endp
code ends
end start
……
code segment
main proc far
assume ……
start:
……
……
mov ax,4c00h
int 21h
main endp
code ends
end start
段名 SEGMENT [定位类型 ] [组合类型 ] [使用类型 ] [?类别
’ ]
……
…… ; 语句序列段名 ENDS
(1) 定位类型 align_type (p120)
PARA BYTE WORD DWORD PAGE
(2) 组合类型 combine_type
PRIVATE PUBLIC COMMON STACK AT exp
(3) 使用类型 use_type
USE16 USE32
(4) 类别 ‘ class’
存储模式与简化段定义伪操作
(1) MODEL 伪操作 (p121)
.MODEL 存储模式 [,语言类型 ] [,操作系统类型 ] [,堆栈选项 ]
存储模式,tiny small medium compact large
huge flat
.model small
.stack 100H
.data
……
.code
.startup
……
.exit 0
end
(2) 简化的段定义伪操作 (p122)
.code [name]
.data
.data?
.fardata [name]
.fardata? [name]
.const
.stack [size]
.model small
.data
……
.code
.startup(P127)
……
.exit 0(P127)
end
.model small
.data
……
.code
start,mov ax,@data
mov ds,ax
……
mov ax,4c00h
int 21h
end start.model small
.const
……
.data
……
.code
start,mov ax,DGROUP
mov ds,ax
……
mov ax,4c00h
int 21h
end start
段组定义伪操作 (p126)
dseg1 segment word public ‘data’
……
dseg1 ends
dseg2 segment word public ‘data’
……
dseg2 ends
datagroup group dseg1,dseg2
cseg segment para public ‘code’
assume cs:cseg,ds:datagroup
start:
mov ax,datagroup
mov ds,ax
……
mov ax,4c00h
int 21h
cseg ends
end start
data1 segment word
const1 dw 100
data1 ends
data2 segment word
var1 dw?
data2 ends
datagroup group data1,data2
code segment
assume cs:code,ds:datagroup
mov ax,datagroup
mov ds,ax
mov ax,const1
mov var1,ax
…
mov ax,4c00h
int 21h
code ends
end start
TITLE text
NAME module_name
END [ label ]
,STARTUP
,EXIT [ return_value ]
◆ 程序开始和结束伪操作 (p126)
◆ 数据定义及存储器分配伪操作:
[变量 ] 助记符 操作数 [,操作数,… ] [ ; 注释 ]
助记符,DB DW DD DF DQ DT
DATA_BYTE DB 10,4,10H,?
DATA_WORD DW 100,100H,-5,?
-
0AH
04H
10H
-
64H
00H
00H
01H
FBH
FFH
-
DATA_BYTE?
DATA_WORD?
例:
ARRAY DB ‘HELLO’
DB ‘AB’
DW ‘AB’
48H
45H
4CH
4CH
4FH
41H
42H
42H
41H
ARRAY?
PAR1 DW 100,200
PAR2 DW 300,400
ADDR_TABLE DW PAR1,PAR2
VAR DB 100 DUP (?)
DB 2 DUP (0,2 DUP(1,2),3)
OPER1 DB?,?
OPER2 DW?,?
……
MOV OPER1,0 ;字节指令
MOV OPER2,0 ;字指令
OPER1 DB 1,2
OPER2 DW 1234H,5678H
……
MOV AX,OPER1+1 ×
MOV AL,OPER2 × 类型不匹配
MOV AX,WORD PTR OPER1+1
MOV AL,BYTE PTR OPER2
(AX)=3402H (AL)=34H
BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP (?)
tos LABEL WORD
LABEL 伪操作,name LABEL type
BYTE_ARRAY?
WORD_ARRAY?
tos?
50字
0064H
◆ 表达式赋值伪操作:
表达式名 EQU 表达式
ALPHA EQU 9
BETA EQU ALPHA+18
BB EQU [BP+8]
,=,伪操作 ( 允许重复定义 )
……
EMP = 7
……
EMP = EMP+1
……
◆ 地址计数器与对准伪操作:
地址计数器 $,保存当前正在汇编的指令的地址
ORG $+8 ; 跳过 8个字节的存储区
JNE $+6 ; 转向地址是 JNE 的首址 +6
JMP $+2 ;转向下一条指令
$ 用在伪操作的参数字段:
表示地址计数器的当前值
ARRAY DW 1,2,$+4,3,4,$+4
00H
01H
00H
02H
00H
7CH
00H
03H
00H
04H
00H
82H
ARRAY?
007E
0078
0074
ORG 伪操作:设置当前地址计数器的值
SEG1 SEGMENT
ORG 10
VAR1 DW 1234H
ORG 20
VAR2 DW 5678H
ORG $+8
VAR3 DW 1357H
SEG1 ENDS
BUFFER LABEL BYTE
ORG $+8
BUFFER DB 8 DUP (?)
ORG 100H
START,……
B DW 2 DUP (?)
ALIGN boundary:使下一地址从指定的
boundary倍数开始 )
ALIGN 4
ALIGN 2 ; EVEN
EVEN,使下一地址从偶地址开始
A DB ‘morning’
EVEN
◆ 基数控制伪操作:
,RADIX 表达式 ; 规定无标记数的数制
MOV BX,0FFH
MOV BX,178
.RADIX 16
MOV BX,0FF
MOV BX,178D
3,汇编语言程序格式标号 指令 寄存器 说明程序或语句变量 伪指令 标号 的功能宏指令 变量常数表达式源程序的每条语句可表示为:
[名字 ] 操作 操作数 [; 注释 ]
标号 /变量,段值、偏移量、类型三种属性表达式,数字表达式 地址表达式表达式操作符:
(1) 算术操作符,?,?,?,?,Mod
VIDEO_BUF DB 25*80*2 DUP(?)
ARRAY DW 1,2,3,4,5,6,7
ARYEND DW?
MOV CX,(ARYEND-ARRAY)/2
ADD AX,BLOCK+2 ; 符号地址?常数 有意义; 时意义不明确
MOV AX,BX+1 ;?
MOV AX,[BX+1] ; 寄存器相对寻址
OPR1 EQU 25 ; 00011001B
OPR2 EQU 7 ; 00000111B
AND AX,OPR1 AND OPR2
(2) 逻辑和移位操作符,AND,OR,XOR、
NOT,SHL,SHR; AND AX,1
IN AL,PORT_VAL ;61H
OUT PORT_VAL AND 0FEH,AL ;60H
MOV AX,0FFFFH SHL 2 ; MOV AX,0FFFCH
(3) 关系操作符,EQ,NE,LT,LE、
GT,GE
计算结果为 逻辑值,真 0FFFFH
假 0000H
X,……
……
Y,……
若?128 (真 ) 汇编结果,MOV FID,-1
若?128 (假 ) 汇编结果,MOV FID,0
MOV FID,(OFFSET Y - OFFSET X) LE 128
(4) 数值回送操作符,OFFSET,SEG、
TYPE,LENGTH,SIZE
SIZE 变量功能,LENGTH * TYPE
OFFSET/ SEG 变量 / 标号功能:回送变量或标号的偏址 / 段址
TYPE 变量 / 标号 / 常数
DB DW DD DF DQ DT NEAR FAR 常数
1 2 4 6 8 10 -1 -2 0
LENGTH 变量功能:回送由 DUP定义的 变量的单元数,其它情况回送 1
ARRAY DW 100 DUP (?)
TABLE DB ‘ABCD’
ADD SI,TYPE ARRAY ; ADD SI,2
ADD SI,TYPE TABLE ; ADD SI,1
MOV CX,LENGTH ARRAY ; MOV CX,100
MOV CX,LENGTH TABLE ; MOV CX,1
MOV CX,SIZE ARRAY ; MOV CX,200
MOV CX,SIZE TABLE ; MOV CX,1
(5) 属性操作符,PTR、段操作符,SHORT,THIS、
HIGH,LOW,HIGHWORD,LOWWORD
HIGH和 LOW CONS EQU 1234H
MOV AH,HIGH CONS
MOV AL,LOW CONS
类型 PTR 表达式 MOV WORD PTR [BX],5
段操作符 MOV ES,[BX],AL
SHORT 标号 JMP SHORT NEXT
THIS 类型 TA EQU THIS BYTE
TD DW 1234H
NEXT EQU THIS FAR
MOV AX,2
4,汇编语言程序的上机过程
.model tiny
.code
org 100h
begin,jmp main;************************
num1 dw 1199H
num2 dw 1166H
sum dw?;************************
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
end begin
code segment 'code'
assume cs:code,ds:code,ss:code,es:code
org 100H
begin,jmp main
num1 dw 1199H
num2 dw 1166H
sum dw?
main proc near
mov ax,num1
add ax,num2
mov sum,ax
mov ax,4c00h
int 21h
main endp
code ends
end begin
第 4章作业
Page 155 4.15 4.16
4.5
4.8 4.12 4.14
4.17