IBM—PC汇编语言程序设计 (第 2版 )
清华大学计算机系列教材 沈美名 温冬蝉 编著计算机语言的发展机器语言
FORTRAN
BASIC
COBOL
PASCAL
C/C++
JAVA
...
汇编语言高级语言汇编语言的特点
面向机器的低级语言,通常是为特定的计算机或计算机系列 专门设计的。
保持了机器语言的优点,具有直接和简捷的特点。
可有效地访问、控制计算机的各种硬件设备,
如磁盘、存储器,CPU,I/O端口等。
目标代码简短,占用内存少,执行速度快,
是高效的程序设计语言。
经常与高级语言配合使用,应用十分广泛 。
#include "stdafx.h"
#include "stdio.h"
int main(int argc,char* argv[])
{ int a,b,c;
a=1;
b=2;
c=a+b;
printf(“c=%d \n",c);
return 0;
}
编程实现 c =a+b,并在屏幕上显示出结果 。
例 1
编译后的目标文件达到 3.59KB
data segment
a db?
b db?
c db?
string db 'c=$'
data ends
code segment
main proc far
assume cs:code,ds:data,es:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
mov a,1
mov b,2
mov al,a
add al,b
mov c,al
lea dx,string
mov ah,09
int 21h
add c,30h
mov dl,c
mov ah,2
int 21h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
ret
main endp
code ends
end start
例 2,C = a + b
汇编后的目标文件只有
208字节第 1章 基 础 知 识
数制
数制之间的转换
运算
数和字符的表示预 备 知 识存储容量
1K = 1024 = 210 ( Kilo)
1M = 1024K = 220 ( Mega)
1G = 1024M = 230 ( Giga)
1个二进制位,bit (比特)
8个二进制位,Byte (字节) 1Byte = 8bit
2个字节,Word (字)
1Word = 2Byte = 16bit
1,数 制数 制 基 数 数 码二进制 Binary 2 0,1
八进制 Octal 8 0,1,2,3,4,5,6,7
十进制 Decimal 10 0,1,2,3,4,5,6,7,8,9
十六进制 Hexadecimal 16 0,1,2,3,4,5,6,7,8,9,
A,B,C,D,E,F
二进制,基数为 2,逢二进一
1101B = 1× 2 3 + 1× 2 2 + 1× 2 0 = 13
十六进制,基数为 16,逢十六进一
1001,0001,1000,0111
9 1 8 7
= 9 × 16 3 + 1 × 16 2 + 8 × 16 1 + 7 × 16 0
2,数制之间的转换
二进制 十六进制
十进制 二进制
十进制 十六进制降幂法 除法
二进制 十六进制
0011 0101 1011 1111
3 5 B F
∴ 0011,0101,1011,1111B = 35BFH
A 1 9 C
1010 0001 1001 1100
∴ A19CH = 1010,0001,1001,1100B
1011B = 23+21+20=11D
降幂法 除法例,27D =? B
27 11 3 3 1
-? -? -? -?
2n 16 8 4 2 1
1 1 0 1 1
∴ 27D = 11011B
二进制 十进制
十六进制 十进制
BF3CH = 11?163 +15?162 +3?161 +12?160
= 48956D
降幂法 除法例,399D =? H
399 143 15 399/16→24/16→1/16→ 0
-? -? -? ↓ ↓ ↓
16n 256 16 1 F 8 1
1 8 F
∴ 399D = 18FH
算术运算二进制数,逢二进一 借一为二加法规则 乘法规则
0 + 0 = 0 0? 0 = 0
0 + 1 = 1 0? 1 = 0
1 + 0 = 1 1? 0 = 0
1 + 1 = 0 ( 进位 1) 1? 1 = 1
3,运算(算术运算和逻辑运算)
0 5 C 3 H
3 D 2 5 H
4 2 E 8 H
+
3 D 2 5 H
0 5 C 3 H
3 7 6 2 H
-1
- 1
十六进制数,逢十六进一 借一为十六
逻辑运算( 按位操作 )
“与”运算( AND),或”运算( OR)
A B A?B A B A?B
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
,非,运算 ( NOT )
,异或,运算 ( XOR)
A?A A B A?B
0 1 0 0 0
1 0 0 1 1
1 0 1
1 1 0
例,X=00FFH Y=5555H,求 Z=X?Y=?
X= 0000 0000 1111 1111 B
Y= 0101 0101 0101 0101 B
Z= 0101 0101 1010 1010 B
Z=55AAH
4,数和字符的表示
计算机中正负 数的表示
7 6 5 4 3 2 1 0
符号位 数值位假设机器 字长 为 16位:
符号位 = 0 正数 数值位
= 1 负数
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
假设机器 字长 为 8位:
H.O.Byte L.O.Byte
H.O.Nibble L.O.Nibble
数的常用表示法 —— 原码 反码 补码原码表示法,符号 + 绝对值例,n = 8bit
[+3]原码 = 0 000,0011 = 03H
[- 3]原码 = 1 000,0011 = 83H
[+0]原码 = 0 000,0000 = 00H
[- 0]原码 = 1 000,0000 = 80H? 0 的表示不惟一反码表示法,正数的反码同原码,负数的反码数值位与原码相反例,n = 8bit
[+5]反码 = 0 000,0101 = 05H
[- 5]反码 = 1 111,1010 = FAH
[+0]反码 = 0 000,0000 = 00H
[- 0]反码 = 1 111,1111 = FFH? 0 的表示不惟一例,机器字长 8位,[- 46]补码 =?
[46]补码 = 0 0 1 0 1 1 1 0
1 1 0 1 0 0 0 1
1 1 0 1 0 0 1 0 = D2H
机器字长 16位,[- 46]补码 = FFD2H
[+0]补码 = 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 = [- 0]补码
0 的表示 惟一按位求反末位加一按位求反末位加一补码 ( Two’s Complement) 表示法:
正数的补码,同原码负数的补码,( 1) 写出与该负数相对应的正数的补码
( 2) 按位求反
( 3) 末位加一十进制 二进制 十六进制 十进制 十六进制
n=8 n=16
+127 0111 1111 7F +32767 7FFF
+126 0111 1110 7E +32766 7FFE
...,.,… …,..
+2 0000 0010 02 +2 0002
+1 0000 0001 01 +1 0001
0 0000 0000 00 0 0000
-1 1111 1111 FF -1 FFFF
-2 1111 1110 FE -2 FFFE
...,.,… …,..
-126 1000 0010 82 -32766 8002
-127 1000 0001 81 -32767 8001
-128 1000 0000 80 -32768 8000
n位二进制补码的表数范围,- 2n-1 ≤ N ≤ 2n-1-1
无符号整数的表数范围,0 ≤ N? ≤ 2n-1
补码的加法和减法:
求补运算?,对一个二进制数按位求反,末位加一
[X]补码? [-X]补码? [X]补码加法规则,[X+Y]补码 = [X]补码 + [Y]补码减法规则,[X-Y]补码 = [X]补码 + [-Y]补码补码减法可转换为补码加法
64
(-46)
18
+
0100 0000
1101 0010
0001 0010
+
例:
进位和溢出进位,由于运算结果超出了位数,最高有效位向前的进位,这一位自然丢失,一般不表示结果的对错 。
溢出,表示结果超出了字长允许表示的范围,
一般会造成结果出错 。
例,(- 64) 11000000 127 01111111
+ 64 01000000 + 1 00000001
0 1 00000000 128 10000000
进位 溢出
字符的表示
ASCII码,用一个 字节 来表示一个字符,低 7位为字符的 ASCII值,最高位一般用作校验位 。
例,‘ A’ 41H
‘a’ 61H
‘1’ 31H
换行 0AH
回车 0DH
空格 20H
实验一 DEBUG的使用
一,实验目的掌握 DEBUG常用命令的使用;熟悉 CPU内部有多少寄存器;掌握访问段式存储器结构地址的表示方法。
二、实验内容将数据段中的两个数求和,结果保存在数据段中。
源程序、机器语言程序如下:
CS:0100 A1 00 00 MOV AX,[0000]
CS:0103 03 06 02 00 ADD AX,[0002]
CS:0107 A3 04 00 MOV [0004],AX
CS:010A CB RETF
数据段内容如下:
DS:0000 2301 2500
三、实验步骤
1、用 E命令键入上述机器语言程序和数据段的初值
-E DS:000 23 01 25 00
-E DS:006 2A 2A 2A
-E CS:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
2、用 D命令检查数据段、代码段内容
-D DS:0
-D CS:100
3、用 T命令逐条执行上述程序,注意每条指令执行后相应寄存器的变化
4、用 U命令反汇编本程序
-U 100 10A
5、用 R命令修改 IP的内容为 0100重新执行上述程序
-R IP
显示,IP 010A
修改为,0100
6、用 G命令运行程序
-G CS:0100 107
观察,IP=? AX=?
-G CS:0100 10A
观察,IP=? AX=?
四、实验思考题
1、用 A命令输入源程序:
CS:0100 MOV AX,FFFF
STC
0104 MOV DS,AX
MOV BX,DS
MOV ES,BX
MOV CX,ES
MOV SS,CX
MOV DX,SS
MOV SP,DX
MOV BP,SP
MOV SI,BP
MOV DI,SI
JNB 0121
XOR AX,DI
JNZ 0125
CLC
JMP 0104
0121 OR AX,DI
JZ 0100
0125 HLT
2、用 T命令单步执行上述程序,观察结果。
清华大学计算机系列教材 沈美名 温冬蝉 编著计算机语言的发展机器语言
FORTRAN
BASIC
COBOL
PASCAL
C/C++
JAVA
...
汇编语言高级语言汇编语言的特点
面向机器的低级语言,通常是为特定的计算机或计算机系列 专门设计的。
保持了机器语言的优点,具有直接和简捷的特点。
可有效地访问、控制计算机的各种硬件设备,
如磁盘、存储器,CPU,I/O端口等。
目标代码简短,占用内存少,执行速度快,
是高效的程序设计语言。
经常与高级语言配合使用,应用十分广泛 。
#include "stdafx.h"
#include "stdio.h"
int main(int argc,char* argv[])
{ int a,b,c;
a=1;
b=2;
c=a+b;
printf(“c=%d \n",c);
return 0;
}
编程实现 c =a+b,并在屏幕上显示出结果 。
例 1
编译后的目标文件达到 3.59KB
data segment
a db?
b db?
c db?
string db 'c=$'
data ends
code segment
main proc far
assume cs:code,ds:data,es:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
mov a,1
mov b,2
mov al,a
add al,b
mov c,al
lea dx,string
mov ah,09
int 21h
add c,30h
mov dl,c
mov ah,2
int 21h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
ret
main endp
code ends
end start
例 2,C = a + b
汇编后的目标文件只有
208字节第 1章 基 础 知 识
数制
数制之间的转换
运算
数和字符的表示预 备 知 识存储容量
1K = 1024 = 210 ( Kilo)
1M = 1024K = 220 ( Mega)
1G = 1024M = 230 ( Giga)
1个二进制位,bit (比特)
8个二进制位,Byte (字节) 1Byte = 8bit
2个字节,Word (字)
1Word = 2Byte = 16bit
1,数 制数 制 基 数 数 码二进制 Binary 2 0,1
八进制 Octal 8 0,1,2,3,4,5,6,7
十进制 Decimal 10 0,1,2,3,4,5,6,7,8,9
十六进制 Hexadecimal 16 0,1,2,3,4,5,6,7,8,9,
A,B,C,D,E,F
二进制,基数为 2,逢二进一
1101B = 1× 2 3 + 1× 2 2 + 1× 2 0 = 13
十六进制,基数为 16,逢十六进一
1001,0001,1000,0111
9 1 8 7
= 9 × 16 3 + 1 × 16 2 + 8 × 16 1 + 7 × 16 0
2,数制之间的转换
二进制 十六进制
十进制 二进制
十进制 十六进制降幂法 除法
二进制 十六进制
0011 0101 1011 1111
3 5 B F
∴ 0011,0101,1011,1111B = 35BFH
A 1 9 C
1010 0001 1001 1100
∴ A19CH = 1010,0001,1001,1100B
1011B = 23+21+20=11D
降幂法 除法例,27D =? B
27 11 3 3 1
-? -? -? -?
2n 16 8 4 2 1
1 1 0 1 1
∴ 27D = 11011B
二进制 十进制
十六进制 十进制
BF3CH = 11?163 +15?162 +3?161 +12?160
= 48956D
降幂法 除法例,399D =? H
399 143 15 399/16→24/16→1/16→ 0
-? -? -? ↓ ↓ ↓
16n 256 16 1 F 8 1
1 8 F
∴ 399D = 18FH
算术运算二进制数,逢二进一 借一为二加法规则 乘法规则
0 + 0 = 0 0? 0 = 0
0 + 1 = 1 0? 1 = 0
1 + 0 = 1 1? 0 = 0
1 + 1 = 0 ( 进位 1) 1? 1 = 1
3,运算(算术运算和逻辑运算)
0 5 C 3 H
3 D 2 5 H
4 2 E 8 H
+
3 D 2 5 H
0 5 C 3 H
3 7 6 2 H
-1
- 1
十六进制数,逢十六进一 借一为十六
逻辑运算( 按位操作 )
“与”运算( AND),或”运算( OR)
A B A?B A B A?B
0 0 0 0 0 0
0 1 0 0 1 1
1 0 0 1 0 1
1 1 1 1 1 1
,非,运算 ( NOT )
,异或,运算 ( XOR)
A?A A B A?B
0 1 0 0 0
1 0 0 1 1
1 0 1
1 1 0
例,X=00FFH Y=5555H,求 Z=X?Y=?
X= 0000 0000 1111 1111 B
Y= 0101 0101 0101 0101 B
Z= 0101 0101 1010 1010 B
Z=55AAH
4,数和字符的表示
计算机中正负 数的表示
7 6 5 4 3 2 1 0
符号位 数值位假设机器 字长 为 16位:
符号位 = 0 正数 数值位
= 1 负数
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
假设机器 字长 为 8位:
H.O.Byte L.O.Byte
H.O.Nibble L.O.Nibble
数的常用表示法 —— 原码 反码 补码原码表示法,符号 + 绝对值例,n = 8bit
[+3]原码 = 0 000,0011 = 03H
[- 3]原码 = 1 000,0011 = 83H
[+0]原码 = 0 000,0000 = 00H
[- 0]原码 = 1 000,0000 = 80H? 0 的表示不惟一反码表示法,正数的反码同原码,负数的反码数值位与原码相反例,n = 8bit
[+5]反码 = 0 000,0101 = 05H
[- 5]反码 = 1 111,1010 = FAH
[+0]反码 = 0 000,0000 = 00H
[- 0]反码 = 1 111,1111 = FFH? 0 的表示不惟一例,机器字长 8位,[- 46]补码 =?
[46]补码 = 0 0 1 0 1 1 1 0
1 1 0 1 0 0 0 1
1 1 0 1 0 0 1 0 = D2H
机器字长 16位,[- 46]补码 = FFD2H
[+0]补码 = 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 = [- 0]补码
0 的表示 惟一按位求反末位加一按位求反末位加一补码 ( Two’s Complement) 表示法:
正数的补码,同原码负数的补码,( 1) 写出与该负数相对应的正数的补码
( 2) 按位求反
( 3) 末位加一十进制 二进制 十六进制 十进制 十六进制
n=8 n=16
+127 0111 1111 7F +32767 7FFF
+126 0111 1110 7E +32766 7FFE
...,.,… …,..
+2 0000 0010 02 +2 0002
+1 0000 0001 01 +1 0001
0 0000 0000 00 0 0000
-1 1111 1111 FF -1 FFFF
-2 1111 1110 FE -2 FFFE
...,.,… …,..
-126 1000 0010 82 -32766 8002
-127 1000 0001 81 -32767 8001
-128 1000 0000 80 -32768 8000
n位二进制补码的表数范围,- 2n-1 ≤ N ≤ 2n-1-1
无符号整数的表数范围,0 ≤ N? ≤ 2n-1
补码的加法和减法:
求补运算?,对一个二进制数按位求反,末位加一
[X]补码? [-X]补码? [X]补码加法规则,[X+Y]补码 = [X]补码 + [Y]补码减法规则,[X-Y]补码 = [X]补码 + [-Y]补码补码减法可转换为补码加法
64
(-46)
18
+
0100 0000
1101 0010
0001 0010
+
例:
进位和溢出进位,由于运算结果超出了位数,最高有效位向前的进位,这一位自然丢失,一般不表示结果的对错 。
溢出,表示结果超出了字长允许表示的范围,
一般会造成结果出错 。
例,(- 64) 11000000 127 01111111
+ 64 01000000 + 1 00000001
0 1 00000000 128 10000000
进位 溢出
字符的表示
ASCII码,用一个 字节 来表示一个字符,低 7位为字符的 ASCII值,最高位一般用作校验位 。
例,‘ A’ 41H
‘a’ 61H
‘1’ 31H
换行 0AH
回车 0DH
空格 20H
实验一 DEBUG的使用
一,实验目的掌握 DEBUG常用命令的使用;熟悉 CPU内部有多少寄存器;掌握访问段式存储器结构地址的表示方法。
二、实验内容将数据段中的两个数求和,结果保存在数据段中。
源程序、机器语言程序如下:
CS:0100 A1 00 00 MOV AX,[0000]
CS:0103 03 06 02 00 ADD AX,[0002]
CS:0107 A3 04 00 MOV [0004],AX
CS:010A CB RETF
数据段内容如下:
DS:0000 2301 2500
三、实验步骤
1、用 E命令键入上述机器语言程序和数据段的初值
-E DS:000 23 01 25 00
-E DS:006 2A 2A 2A
-E CS:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
2、用 D命令检查数据段、代码段内容
-D DS:0
-D CS:100
3、用 T命令逐条执行上述程序,注意每条指令执行后相应寄存器的变化
4、用 U命令反汇编本程序
-U 100 10A
5、用 R命令修改 IP的内容为 0100重新执行上述程序
-R IP
显示,IP 010A
修改为,0100
6、用 G命令运行程序
-G CS:0100 107
观察,IP=? AX=?
-G CS:0100 10A
观察,IP=? AX=?
四、实验思考题
1、用 A命令输入源程序:
CS:0100 MOV AX,FFFF
STC
0104 MOV DS,AX
MOV BX,DS
MOV ES,BX
MOV CX,ES
MOV SS,CX
MOV DX,SS
MOV SP,DX
MOV BP,SP
MOV SI,BP
MOV DI,SI
JNB 0121
XOR AX,DI
JNZ 0125
CLC
JMP 0104
0121 OR AX,DI
JZ 0100
0125 HLT
2、用 T命令单步执行上述程序,观察结果。