当前位置:文档之家› 32位汇编语言程序设计17稿b

32位汇编语言程序设计17稿b


35
0在补码中只有一种表示法。整数数值在计算 机元件级用二进制补码表示。注意补码表示是 非对称性的。8位补码表示有符号数的范围是 -128~127,16位补码表示有符号数的范围是 -32768~32767 。 我们将补码逐位取反,再加1的运算称为求补 运算。正数的补码经过求补运算结果是它相反 数的补码;负数的补码经过求补运算结果也是 它相反数的补码。
第一章 汇编语言单词
1.1 汇编语言字符集和单词 1.2 注释符 1.3 专用符号 1.4 保留字 1.5 标识符 1.6 汇编语言程序格式
2021/4/4
6
1.1 汇编语言字符集和单词
汇编语言采用ASCII码字符作为自己语 言的字符集。 汇编语言的单词由一个或 多个ASCII码字符组成,它们对于汇编 程序有预定的语法意义。汇编语言的单 词包括注释符、专用符号、保留字、标 识符等。
end 程序ram,begin,end 是汇编语言的 保留字。程序名要按标识符取名。声明段用 来声明各种变量、常量为它们赋予初值;还 用来声明过程。begin和end之间是代码段。
汇编语言提供了输入输出标准库,为了使用 输入输出标准库,必须在程序开始用包含语 句把标准库的头文件"stdlib.hhf"包含到程序 中来。
2021/4/4
21
2021/4/4
22
2021/4/4
23
2021/4/4
24
如果用C++编写同样的程序,编写的代码如下: #include "stdafx.h" #include "stdio.h"
int main(int argc, char* argv[]) { printf("汇编语言编程开始了!\n"); return 0; }
2021/4/4
30
例1:设n=8,求二进制数10010, -10010的原 码。 二进制数 10010的原码是00010010,在此最 高位的0代表 + 号。 二进制数-10010的原码是10010010,在此最 高位的1代表 – 号。 根据定义, 0 在原码中有两种表示,所以计 算机内整数不采用原码表示法。
(2)单行注释符 mov ( 365 , ecx); // 给计数器赋初值
2021/4/4
9
1.3 专用符号
专用符号主要包括汇编语言的运算符、分 隔符、数制标识符。专用符号有一个字符 的也有两个字符的。下面是一个字符的专 用符号。 */+-()[] :;,. =&|^!@$% '"{ }
下面是两个字符的专用符号。
01010111
3. 取反码
10101000
4. 加1
10101001
2021/4/4
// n位补码
34
计算 - 119 的补码
1. 十进制换成二进制 - 1110111
2.求负数绝对值 1110111
3.求补码
01110111
4.取反码
10001000
5.末位加1
10001001
2021/4/4
2021/4/4
29
(一)原码表示法 如果正数的符号用0 表示,负数的符号用1 表 示,绝对值用二进制数表示,这就是原码表 示法。假设计算机字长是n 位,能表示n-1位 有符号整数,设X=Xn-2Xn-3…X0,原码表示是:
[X]源码=
0Xn-2Xn-3…X0 1Xn-2Xn-3…X0
X≥ 0 X≤ 0
2021/4/4
36
从机器数计算它的真值 对于正数,直接用权的多项式展开求和。 例:已知n=8位,求01001010的真值 用权的多项式展开求和: 原式=26+23+21=74 对于负数,有两种方法,每种方法有多个计
算步骤。
2021/4/4
37
方法一:根据补码的定义
[X]补码 = 2n+X - X = 2n - [X]补码 注意X本身是负数。
方法二:对负数的补码求补,得到它的绝对 值,计算绝对值的权的多项式的和,然后对 和实施取负运算。
2021/4/4
38
我们看同一个整数补码用不同位数表示时有何差别。 例4:求117,-117的8位和16位的补码。
117 的补码
n=8
01110101
n = 16 0000000001110101 -117 的补码
2021/4/4
13
指令助记符和语句 ADD INC ADC SUB DEC CMP NEG SBB MUL IMUL INTMUL DIV IDIV MOD IMOD IF ELSE ENDIF WHILE ENDWHILE FOR ENDFOR FOREVER ENDFOR REPEAT UNTIL
val
static var readonly const
……
如果想了解汇编语言专用符号和保留字的更 多的相关信息,请参考HLA手册。
2021/4/4
16
1.5 标识符
标识符可用作程序名、变量名、常量名、函 数名、过程名、标号等。汇编语言的标识符 必须以字母或下划线开始,后面可跟字母、 数字、下划线。由于受MASM的限制,标识符 的长度不能超过236个ASCII字符。汇编语言 的标识符区分大小写字母。 标识符不能与保留字同名。
&& || <= >= <> != == := ..
2021/4/4
10
例2:专用符号举例 mov( &data , eax ); stdout.put( " 32位汇编语言", nl ); stdout.put("pi=",pi:10:3, nl ); stdout.put( $6f, nl ); stdout.put( % 10101010, nl );
100000000 - 1110111
10001001
2021/4/4
33
方法2:写出负数的绝对值,求绝对值的补 码,然后对每位取反(包括符号位),末位加 1。
例3:n=8,求(- 1010111)2和-119的补码。
计算(- 1010111)2 的补码 1. 求负数绝对值 1010111
2. 求补码
2021/4/4
17
例3:合法的标识符和非法的标识符
(1)合法的标识符
addtion big first last
a1
s1 small Small
(2)非法的标识符 %a1 5s AL s[1]
2021/4/4
18
1.6 汇编语言程序格式
program 程序名; <<各种数据段声明>>
begin 程序名; <<程序指令序列>> // 代码段
26
汇编语言程序具有占用空间小,运行效率高
的优点,与这个汇编语言程序相似的C/C++
程序经编译后产生的执行代码约有152KB,
而汇编语言编译的结果不到8K,汇编语言程
序常用于嵌入系统,控制系统编程,也用于
编写设备驱动程序,而设计图形界面不是汇
编语言的特长,每种程序语言都各有擅长,
在应用中注意要扬长避短。
n=8
10001011
n = 16 1111111110001011 从例子中得出:一个8位补码数要变成16位补码数时 ,只需用它的符号位的值填满高8位。这个操作称为 符号扩展。
2021/4/4
39
因为在计算机元件级无法区分一个二进制数是 有符号的还是无符号的。所以在机器内一个二 进制数可代表有符号数,也可代表无符号数。 例如: 假定n=8位,机器内有个整数 %10001010,它 可以代表无符号数138;也可以代表有符号数 -118。汇编语言程序员对程序中的整数哪些是 无符号的,哪些是有符号的必须一清二楚。
2021/4/4
20
例3:显示“汇编语言编程开始了!” 的汇编 语言程序
program HelloWorld; #include( "stdlib.hhf" ) // 包含标准库头文件 begin HelloWorld;
stdout.put( "汇编语言编程开始了!", nl ); stdout.put( “击回车键退出 " ); stdin.readLn(); end HelloWorld;
32位汇编语言程序设计
计算机科学与信息工程学院
2021/4/4
赵建州
1
前言
《32位汇编语言程序设计》是计算机软件课 程。也是计算机专业学生的必修课程,与其
他程序设计语言相比,汇编语言对机器的硬
件层封装最少,在操作系统的控制下允许程
序员最大限度地直接访问计算机硬件。汇编
语言从语言的角度逼真地描述了微处理器的
2021/4/4
3
第一章 汇编语言单词 第二章 CPU映像和机器数 第三章 内存数据映像 第四章 操作数寻址方式 第五章 输入输出函数 第六章 整型运算 第七章 整型控制结构
2021/4/4
结束放映 4
第八章 浮点型运算 第九章 指针和字符串 第十章 数组和串 第十二章 过程
2021/4/4
结束放映 5
- 1010111 10101001
例2:n=8,求( -1010111) 2和-119的补码。 [-1010111]补码 = 28-1010111
=100000000-1010111
=10101001 [-119]补码 = 28-1110111
=100000000-1110111 =10001001
2021/4/4
25
#include "stdafx.h" #include "iostream" using namespace std; int main(int argc, char* argv[]) { cout<<"汇编语言编程开始了!"<<endl;
相关主题