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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法二:对负数的补码求补,得到它的绝对 值,计算绝对值的权的多项式的和,然后对 和实施取负运算。
2021/4/4
38
我们看同一个整数补码用不同位数表示时有何差别。 例4:求117,-117的8位和16位的补码。
117 的补码
n=8
01110101
n = 16 0000000001110101 -117 的补码
35
0在补码中只有一种表示法。整数数值在计算 机元件级用二进制补码表示。注意补码表示是 非对称性的。8位补码表示有符号数的范围是 -128~127,16位补码表示有符号数的范围是 -32768~32767 。 我们将补码逐位取反,再加1的运算称为求补 运算。正数的补码经过求补运算结果是它相反 数的补码;负数的补码经过求补运算结果也是 它相反数的补码。
32位汇编语言程序设计
计算机科学与信息工程学院
2021/4/4
赵建州
1
前言
《32位汇编语言程序设计》是计算机软件课 程。也是计算机专业学生的必修课程,与其
他程序设计语言相比,汇编语言对机器的硬
件层封装最少,在操作系统的控制下允许程
序员最大限度地直接访问计算机硬件。汇编
语言从语言的角度逼真地描述了微处理器的
2021/4/4
20
例3:显示“汇编语言编程开始了!” 的汇编 语言程序
program HelloWorld; #include( "stdlib.hhf" ) // 包含标准库头文件 begin HelloWorld;
stdout.put( "汇编语言编程开始了!", nl ); stdout.put( “击回车键退出 " ); stdin.readLn(); end HelloWorld;
2021/4/4
31
(二)补码表示法 n位二进制补码的定义是:
X
0
[X]补码=
2n+X -2n-1
X是n-1位二进制整数
≤X≤ 2n-1-1 ≤X< 0
2021/4/4
32
二进制数转换为补码
100000000
二进制正数转换成补码与原码相同。 二进制负数转换成补码有两种方法: 方法1:根据定义求补码
2021/4/4
27
第二章 机器数和CPU映像
2.1 整数机器数编码 2.2 机器整数的加减法运算及溢出问题 2.3 字符机器数编码 2.4 Intel 80x86 CPU映像
2021/4/4
28
2.1整数机器数编码
汇编语言语法把二进制整数分为两种,无符
号和有符号整数。无符号整数是指数据的每 一位都代表数值。在汇编语言程序设计里, 内存地址(指针),循环次数,ASCII 码等都 是无符号整数。数学运算中整数值有正数和 负数之分,在计算机元件级怎样表示正号和 负号?答案是只能用数字表示正号和负号。 因此必须进行符号和数值混合编码。
2021/4/4
30
例1:设n=8,求二进制数10010, -10010的原 码。 二进制数 10010的原码是00010010,在此最 高位的0代表 + 号。 二进制数-10010的原码是10010010,在此最 高位的1代表 – 号。 根据定义, 0 在原码中有两种表示,所以计 算机内整数不采用原码表示法。
- 1010111 10101001
例2:n=8,求( -1010111) 2和-119的补码。 [-1010111]补码 = 28-1010111
=100000000-1010111
=10101001 [-119]补码 = 28-1110111
=100000000-1110111 =10001001
2021/4/4
3
第一章 汇编语言单词 第二章 CPU映像和机器数 第三章 内存数据映像 第四章 操作数寻址方式 第五章 输入输出函数 第六章 整型运算 第七章 整型控制结构
2021/4/4
结束放映 4
第八章 浮点型运算 第九章 指针和字符串 第十章 数组和串 第十二章 过程
2021/4/4
结束放映 5
end 程序名;
2021/4/4
19
程序中的program,begin,end 是汇编语言的 保留字。程序名要按标识符取名。声明段用 来声明各种变量、常量为它们赋予初值;还 用来声明过程。begin和end之间是代码段。
汇编语言提供了输入输出标准库,为了使用 输入输出标准库,必须在程序开始用包含语 句把标准库的头文件"stdlib.hhf"包含到程序 中来。
2021/4/4
25
#include "stdafx.h" #include "iostream" using namespace std; int main(int argc, char* argv[]) { cout<<"汇编语言编程开始了!"<<endl;
return 0; }
2021/4/4
26
汇编语言程序具有占用空间小,运行效率高
的优点,与这个汇编语言程序相似的C/C++
程序经编译后产生的执行代码约有152KB,
而汇编语言编译的结果不到8K,汇编语言程
序常用于嵌入系统,控制系统编程,也用于
编写设备驱动程序,而设计图形界面不是汇
编语言的特长,每种程序语言都各有擅长,
在应用中注意要扬长避短。
100000000 - 1110111
10001001
2021/4/4
33
方法2:写出负数的绝对值,求绝对值的补 码,然后对每位取反(包括符号位),末位加 1。
例3:n=8,求(- 1010111)2和-119的补码。
计算(- 1010111)2 的补码 1. 求负数绝对值 1010111
2. 求补码
n=8
10001011
n = 16 1111111110001011 从例子中得出:一个8位补码数要变成16位补码数时 ,只需用它的符号位的值填满高8位。这个操作称为 符号扩展。
2021/4/4
39
因为在计算机元件级无法区分一个二进制数是 有符号的还是无符号的。所以在机器内一个二 进制数可代表有符号数,也可代表无符号数。 例如: 假定n=8位,机器内有个整数 %10001010,它 可以代表无符号数138;也可以代表有符号数 -118。汇编语言程序员对程序中的整数哪些是 无符号的,哪些是有符号的必须一清二楚。
2021/4/4
7
1.2 注释符
汇编语言的注释符分单行注释符和跨行注释 符。
单行释符 // 可以放在程序某行中任何位置,编译程序 忽略从 // 开始到行尾的所有内容。
跨行注释符 /* */ 编译程序忽略从 /* 开始到 */ 之间的所有内 容。
2021/4/4
8
例1:注释的用法 (1)跨行注释符 /* 下面的程序段对数组 实施快速排序算法 */ …… mov ( 365 , ecx); /* 给计数器赋初值 */
2021/4/4
14
数据类型名称 int8 int16 int32 uns8 uns16 uns32 real32 real64 real80 byte word dword char string cset
qword array
lword boolean
2021/4/4
15
其他符号
program begin end procedure type
(2)单行注释符 mov ( 365 , ecx); // 给计数器赋初值
2021/4/4
9
1.3 专用符号
专用符号主要包括汇编语言的运算符、分 隔符、数制标识符。专用符号有一个字符 的也有两个字符的。下面是一个字符的专 用符号。 */+-()[] :;,. =&|^!@$% '"{ }
下面是两个字符的专用符号。
val
static var readonly const
……
如果想了解汇编语言专用符号和保留字的更 多的相关信息,请参考HLA手册。
2021/4/4
16
1.5 标识符
标识符可用作程序名、变量名、常量名、函 数名、过程名、标号等。汇编语言的标识符 必须以字母或下划线开始,后面可跟字母、 数字、下划线。由于受MASM的限制,标识符 的长度不能超过236个ASCII字符。汇编语言 的标识符区分大小写字母。 标识符不能与保留字同名。
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 程序名; <<程序指令序列>> // 代码段
2021/4/4
11
1.4 保留字
保留字也称关键字,保留字包括 CPU中的寄 存器名,汇编语言的指令助记符,语句,数 据类型名称等。 汇编语言的保留字不区分大小写。
2021/4/4
12
CPU中的寄存器名 AL AH AX EAX BL BH BX EBX CL CH CX ECX DL DH DX EDX SI ESI DI EDI BP EBP SP ESP ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7
01010111
3. 取反码
10101000
4. 加1
10101001
2021/4/4
// n位补码
34
计算 - 119 的补码
1. 十进制换成二进制 - 1110111
2.求负数绝对值 1110111
3.求补码
01110111
4.取反码
10001000
Fra Baidu bibliotek
5.末位加1
10001001
2021/4/4
&& || <= >= <> != == := ..
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 );
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
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; }
体系结构,从软件角度描述了计算机系统硬 件层的运行规则。不同的CPU体系有不同的 汇编语言。本课介绍的是Intel 80X86CPU系 列的32位汇编语言。
2021/4/4
2
在学习计算机专业其他课程时,会遇到一些该课程
不能解答的问题:常数为什么不能修改,数据为什 么要有数据类型,指针为什么也要有数据类型,为 什么C/C++语言中数组的下标从0 开始,为什么不 能用值传递参数或自动局部变量从函数带回信息, 函数的形参变量和自动局部变量放在内存的哪一部 分,它们为什么会随着函数的结束而消失, C/C++ 语言中为什么要区分整数运算和浮点数运算等等, 通过学习32位汇编语言程序设计,会帮助你理解许 多其他课程留下的问题。
2021/4/4
36
从机器数计算它的真值 对于正数,直接用权的多项式展开求和。 例:已知n=8位,求01001010的真值 用权的多项式展开求和: 原式=26+23+21=74 对于负数,有两种方法,每种方法有多个计
算步骤。
2021/4/4
37
方法一:根据补码的定义
[X]补码 = 2n+X - X = 2n - [X]补码 注意X本身是负数。
第一章 汇编语言单词
1.1 汇编语言字符集和单词 1.2 注释符 1.3 专用符号 1.4 保留字 1.5 标识符 1.6 汇编语言程序格式
2021/4/4
6
1.1 汇编语言字符集和单词
汇编语言采用ASCII码字符作为自己语 言的字符集。 汇编语言的单词由一个或 多个ASCII码字符组成,它们对于汇编 程序有预定的语法意义。汇编语言的单 词包括注释符、专用符号、保留字、标 识符等。
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
相关文档
最新文档