32位汇编上机指导
3/7
(验证习题 验证习题3.20、 3.21 、 3.26) 验证习题 、
4/7
实验一 熟悉汇编语言开发环境与工具
二、实验内容
下面各条指令是否有错?编写一完整的程序进行验证, 4. 下面各条指令是否有错?编写一完整的程序进行验证, 详细记录汇编程序给出的错误信息。说明具体错误原因。 详细记录汇编程序给出的错误信息。说明具体错误原因。 mov mov mov mov mov add mov ecx,dx al,300 , 20h,ah es,1234h es,ds ax,[esi][edi] [edx],10
实验一 熟悉汇编语言开发环境与工具
二、实验内容
3. 编写一完整的程序,单步执行。记录每条语句执行后寄 编写一完整的程序,单步执行。 存器AL的值和标志位 的值。 存器 的值和标志位 CF、 ZF、 SF、 OF的值。 、 、 、 的值 mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al
3/8
循环程序设计实验 实验三 循环程序设计实验 二、实验内容
numbers的定义 的定义: 2. Fibonacci numbers的定义: f1=1,f2=1, fn= fn-1 + fn-2 n>=3 f1=1,f2=1, fn- fn编程输出Fibonacci numbers的前 的前3 编程输出Fibonacci numbers的前30项。
6/7
实验二 简单分支程序设计实验
二、实验内容 4.编程实现习题4.11和4.21 。 4.编程实现习题 编程实现习题 和
7/7
实验二 简单分支程序设计实验
回答问题: 回答问题:
在多分支结构中, 1. 在多分支结构中,为什么必须要有无条件转移 指令? 指令? 2.在汇编语言中 2.在汇编语言中while和do while循环结构是 否可变换为一种结构?如何做? 否可变换为一种结构?如何做? 高级语言中逻辑表达式 逻辑表达式在汇编语言中是如何实 3. 高级语言中逻辑表达式在汇编语言中是如何实 现的? 现的?
〔习题4.17〕 习题 〕
6/8
循环程序设计实验 实验三 循环程序设计实验
二、实验内容
5.有一个首地址为 5.有一个首地址为string的字符串 ,分别 有一个首地址为 的字符串 统计string中空格、英文字母、数字和其它 中空格、 统计 中空格 英文字母、 字符的个数并输出。 字符的个数并输出。
1/8
循环程序设计实验 实验三 循环程序设计实验 一、实验目的
指令。 1. 掌握 loop 指令。 2. 掌握while和do while循环结构。 掌握while和 while循环结构 循环结构。 掌握伪指令.while和 .repeat。 3. 掌握伪指令.while和 .repeat。 4. 掌握一维数组处理的常用算法;迭代与枚 掌握一维数组处理的常用算法; 举等算法。 举等算法。
思考题: 思考题:在不产生溢出的情况下n的最 大值是多少? 大值是多少?
4/8
循环程序设计实验 实验三 循环程序设计实验
二、实验内容
3. 有一个首地址为 有一个首地址为array的20个有符号的双字数 的 个有符号的双字数 组,编程分别求出正数的和与负数的和并输 出。
思考题:将求和改为求最大值与最小值。 思考题:将求和改为求最大值与最小值。
32位汇编语言程序设计 32位汇编语言程序设计 实验指导
2008年 2008年3月
西安理工大学计算机科学与技术系
实验一 熟悉汇编语言开发环境与工具
一、实验目的
掌握汇编语言程序上机过程。 1. 掌握汇编语言程序上机过程。 掌握汇编语言程序结构。 2. 掌握汇编语言程序结构。 掌握教科书表2.3中常用 子程序的使用方法(P48 。 中常用I/O子程序的使用方法 3. 掌握教科书表 中常用 子程序的使用方法 P48)。 了解汇编程序与连接程序的功能,列表文件的意义。 4. 了解汇编程序与连接程序的功能,列表文件的意义。 掌握VC IDE下DEBUG调试汇编语言程序的方法 调试汇编语言程序的方法。 5. 掌握VC IDE下DEBUG调试汇编语言程序的方法。
2/8
实验四 子程序与操作系统功能调用
二、实验内容
1.编写一个求 的子程序 利用它求1!+2! +3! +4! 1.编写一个求n!的子程序,利用它求 编写一个求 的子程序, +5! +6! +7! +8! 的和并输出。 的和并输出。 要求参数的传递分别采用:寄存器传递、 要求参数的传递分别采用:寄存器传递、全 局变量传递,堆栈传递三种不同的方法实现。 局变量传递,堆栈传递三种不同的方法实现。分 析说明三种不同的参数的传递特点。 析说明三种不同的参数的传递特点。
2/7
实验二 简单分支程序设计实验
二、实验内容
1.编写程序,计算下面函数的值并输出。 1.编写程序,计算下面函数的值并输出。 编写程序
2 x s = 3 x 4 x
( x < 0) (0 <= x <= 10 ) x > 10
3/7
实验二 简单分支程序设计实验
二、实验内容
2.输入一个年份 调用 子程序),判断是否 2.输入一个年份(调用readuid子程序 判断是否 输入一个年份 调用readuid子程序 是闰年. 是闰年 提示:采用伪代码描述如下: 提示:采用伪代码描述如下: read year if (year mod 4=0 and year mod 100 <>0) or (year mod 400=0) then print year ,'is leap year. ' 'is else print year ,'is not leap year. ' 'is
提示:采用div指令把整数分解为单个的数字,并将它们组 div指令把 提示:采用div指令把整数分解为单个的数字, 合成一个新的整数。
8/8
循环程序设计实验 实验三 循环程序设计实验
二、实验内容
7.编写程序,求出所有满足勾股定理且边长 不 7.编写程序, 编写程序 大于500的直角三角形。 的直角三角形。 大于 的直角三角形 提示:采用三重循环,用穷举法求解。 提示:采用三重循环,用穷举法求解。
三角形、等边三角形。 三角形、等边三角形。
5/7
实验二 简单分支程序设计实验
二、实验内容 3. 采用无条件和条件转移指令构造while和
பைடு நூலகம்
do while循环结构,完成下面的求和任务并 循环结构, 为双字)。 输出sum(sum 为双字 。
sum=1+2+3+….+n
思考题:假设sum 为双字无符号整数,在和不溢出 思考题:假设sum 为双字无符号整数, 的情况下求出n的最大值;输出sum和 的值。 的情况下求出n的最大值;输出sum和n的值。
实验一 熟悉汇编语言开发环境与工具
5/7
二、实验内容 6. 采用小端方式多字节数据在内存中是如何存 采用小端方式 小端方式多字节数据在内存中是如何存 放的?编写代码进行验证。要求记录程序运 放的?编写代码进行验证。 行时各个变量的首地址及字节排列的顺序。 行时各个变量的首地址及字节排列的顺序。 (习题3.15) 7. 编程实现习题 编程实现习题3.14 和3.28
3/8
在DEBUG中查看内存变量 中查看内存变量
6/7
7/7
回答问题: 回答问题:
语句后没有起始地址, 1. end 语句后没有起始地址,会出现什么情况 ? 2. 如何获取数据段的起始地址。 如何获取数据段的起始地址。
1/7
实验二 简单分支程序设计实验
一、实验目的
掌握算术运算指令 算术运算指令。 1. 掌握算术运算指令。 掌握CMP、 TEST、条件转移与无条件转移指令。 2. 掌握CMP、 TEST、条件转移与无条件转移指令。 掌握分支程序设计结构。 3. 掌握分支程序设计结构。
1/7
实验一 熟悉汇编语言开发环境与工具
二、实验内容
2/7
1.在命令行方式下完成HelloWord.asm的编辑、调试与运行。 1.在命令行方式下完成HelloWord.asm的编辑、调试与运行。 在命令行方式下完成HelloWord.asm的编辑 要求:详细记录实验的每一步骤,查看列表文件。 要求:详细记录实验的每一步骤,查看列表文件。 2.在VC IDE下完成 下完成HelloWord.asm的编辑、调试与运行。 的编辑、 2.在 下完成 的编辑 调试与运行。 要求: 详细记录创建VC IDE下实验环境的每一步骤。 下实验环境的每一步骤。 要求:⑴ 详细记录创建 下实验环境的每一步骤 程序运行时字符变量msg的首地址? ⑵ 程序运行时字符变量msg的首地址? msg的首地址 程序运行时第一条可执行语句的首地址? ⑶ 程序运行时第一条可执行语句的首地址? 的值? 程序加载到内存后寄存器ESP、CS、DS的值 ⑷ 程序加载到内存后寄存器ESP、CS、DS的值?
实验四 子程序与操作系统功能调用 一、实验目的
1/8
掌握主程序与子程序间参数传递的方法。 1. 掌握主程序与子程序间参数传递的方法。 2. 掌握Windows API的调用方法。 掌握Windows API的调用方法 的调用方法。 掌握Dos的功能调用方法 的功能调用方法。 3. 掌握Dos的功能调用方法。 4. 掌握将复杂的应用问题分解为简单的小问 题的方法,深刻理解“自定向下, 题的方法,深刻理解“自定向下,逐步求 精”的思想。 的思想。
5/8
循环程序设计实验 实验三 循环程序设计实验
二、实验内容
4.有一个首地址为 4.有一个首地址为string的字符串 ,剔除 有一个首地址为 的字符串 string中所有的空格字符。请从字符串最后 中所有的空格字符。 中所有的空格字符 一个字符开始逐个向前判断、并进行处理。 一个字符开始逐个向前判断、并进行处理。
汇编语言程序设计及上机指导第3章指令格式与寻址方式
高地址
(2)寄存器间接寻址
返回
操作数在存储器中,而操作数的有效地址EA却在指定的寄存器中,
即 EA=[寄存器]
1)16位寻址时,EA放在SI、DI、BP或BX中。
若以SI、DI、BX间接寻址,则默认操作数在DS段中。
MOV AX,[SI]
;默认DS为段基址
若以寄存器BP间接寻址,则默认操作数在堆栈段中。
BX,BP
SI,DI
不用该分量,默 认为1
0,8,16(位)
所有32位通用寄存器
除ESP外的所有32位 通用寄存器
1,2,4,8(倍)
0,8,32(位)
所有32位/64位通用寄存 器(16个)
所有32位/64位通用寄存 器(16个)
1,2,4,8(倍)
0,8,32,64(位)
如:ADD AX,20[BX][SI]
MOV ECX,[EBP+50] ;也可写成 MOV ECX,50[EBP]
MOV DX,[EAX+BASE] ;也可写成 MOV DX,BASE[EAX]
BASE是符号常量或变量
MOV ECX,[EBP+50]指令执行时,EBP寄存器内容为3000H,再加上 位移量50H之和为3050H,然后把由SS寄存器寻址的段中的3050H 单元的32位数据传送给ECX。
最常用的数据传送指令MOV的格式为: MOV DEST,SRC ;将源操作数SRC的值传送至目的操作数
【例】 MOV EAX,EBX ;将EBX的值送给EAX
2019/6/4
3.2.2 有效地址的概念
返回
在80X86系列CPU中,内存单元的地址由两部分组成:
段基地址和段内偏移地址(也称段内偏移量)
32位汇编语言程序设计部分课后习题答案
3.1 简答题-1
(1)如何修改“MOV ESI, WORD PTR 250”语句使其 正确?
• 删除“WORD PTR”即可
(2)为什么说“XCHG EDX,CX”是一条错误的指令?
32位汇编语言习题解答
课件制作: 钱晓捷
钱晓捷,32位汇编语言程序设计,机械工业出版社
第1章习题:汇编语言基础
1.1 简答题(1、3、6、7、8) 1.2 判断题(1、6、7、8、9) 1.3 填空题(3、4、5、7、10) 1.9、1.13、1.15、1.16
1.1 简答题-1
(1)哪个处理器的指令系统成为Intel
• 没有
(8)汇编语言的标识符大小写不敏感意味着什么?
• 表示字母大小写不同、但表示同一个符号
4
习题解答
1.2 判断题
1)EAX也被称为累加器,因为它使用最频繁。
• 对,EAX中的A来自英文累加器(Accumulator)
6)处理器的传送指令MOV属于汇编语言的执行性语句
•对
7)汇编语言的语句由明显的4部分组成,不需要分隔 符区别。
13,10
byte
'---+-------------------------------',
13,10
byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,
24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h
byte 2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h,
• 寄存器寻址,立即数寻址
(9)已知ESI=04000H,EBX=20H,指令“MOV EAX, [ESI+EBX*2+8]”中访问的有效地址是__________。
32位汇编语言学习笔记3leal和算术运算指令
32位汇编语言学习笔记3leal和算术运算指令32位汇编语言学习笔记在学习汇编语言的过程中,我们已经了解了一些基本指令和寄存器的用法。
本文将继续介绍两个重要的指令:leal指令和算术运算指令。
通过深入了解和学习这两个指令,我们将更好地理解和掌握汇编语言编程的技巧和方法。
一、leal指令leal指令用于将一个有效地址(Effective Address,EA)加载到目标操作数中。
它的一般格式为:leal Source, Destination。
在这个指令中,Source表示源操作数,可以是寄存器、内存或立即数。
Destination表示目标操作数,只能是寄存器。
leal指令在源操作数的基础上进行计算,将计算结果存储到目标操作数中。
下面是一些leal指令的示例:1. leal (%eax,%ebx,4), %edx这条指令将地址(%eax + %ebx * 4)的结果存储到%edx寄存器中。
其中,%eax是个基址寄存器,%ebx是个变址寄存器,4表示缩放因子。
2. leal -8(%ebp), %ecx这条指令将地址(%ebp - 8)的结果存储到%ecx寄存器中。
其中,%ebp是个基址寄存器,-8是个偏移量。
需要注意的是,leal指令只能进行地址计算,并将结果存储到目标操作数中,不能进行实际的加载操作。
二、算术运算指令在汇编语言中,算术运算指令主要用于进行数值的计算和操作。
常见的算术运算指令包括add、sub、mul、div等。
这些指令可以对数据寄存器和内存中的数据进行四则运算。
下面是一些常用的算术运算指令及其示例:1. add指令:用于将两个操作数相加,并存储结果到目标操作数中。
一般格式为:add Source, Destination。
示例:add %eax, %ebx这条指令将%eax和%ebx寄存器中的值相加,结果存储到%ebx中。
2. sub指令:用于将第一个操作数减去第二个操作数,并将结果存储到目标操作数中。
汇编语言程序设计实验指导
汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6. X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。
旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。
(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令: A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。
一、DEBUG 命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG, 进入调试环境,显示提示符 '- '。
2、用命令 F 200 220 'AB' 将'AB'的两个ASCII码循环填入内存。
注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。
3、用命令 D200 观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令 F230 23F 12 重复上二项实验,观察结果并比较。
5、用命令 E200 41 42 43 44 45将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
6、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H (2)23H,45H (3)AB,3045H注:输入 H 12 34 则在下一行显示0046 FFDE,即二者的补码和与差。
windows环境下32位汇编语言程序设计附书代码
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
汇编语言上机过程(自学)
附加1 用DEBUG验证程序段
通常汇编教学中,汇编程序结构会在指令系 统后面讲,学生在学习指令系统时由于没有讲汇 编程序结构而无法编写汇编程序来加深对汇编指 令的理解,因此,在这里我们通过2个例子,介 绍使用DEBUG调试工具编写程序段来学习汇编 指令。 有关DEBUG的常用命令的用法请参看教材的 P32 2.5 DEBUG主要命令
为 1时 OV DN EI NG ZR AC PE CY
为 0时 NV UP DI PL NZ NA PO NC
再举一个有访存操作的例子 MOV SI, 0050H MOV DI, 0100H MOV CX, 5 CLD REP MOVSB ; (DS)=2000H ; (ES)=3000H
1)先用A命令输入程序
2)用R命令修改DS和ES寄存器到约定值 DS的原始值 输入的修改值
3)用D命令查看源数据区和目标数据区
4)用E命令初始化源数据区后再用D命令检查源数据 区和目的数据区
5)单步跟踪执行程序
6)执行后检查源数据区和目标数据区
注意,用A命令输入指令时,如果输入错误debug会立 即指出错误和位置。地址不会变化,以便用户修正指 令。
标志位
这是MOV BX,[SI]的执行结果
这是还未执行的下 一条指令
3)对于系统功能调用,可以用G命令来自置断点执行, 也可以用P命令跳过过程与系统功能服务程序。
设断点执行,断点设在INT 21H的后一句 INT 21H输出的一个字符
注意:DEBUG只支持16位汇编调试,如果要编写32位 汇编程序,需要用MASM 6.11汇编和连接,用 CodeView软件查看执行代码。但MASM 6.11中带的 CodeView 4.01可以查看32位程序的执行代码,不能进 行单步调试。要调试可以考虑使用SoftICE软件。 另外,VC嵌入汇编可以支持80486的所有指令,也支 持32位汇编。
汇编语言上机环境及基本操作
汇编语言上机环境及基本操作汇编语言是一种低级语言,它直接面向硬件,可以直接访问计算机的底层资源。
为了学习和实践汇编语言,我们需要了解如何搭建汇编语言上机环境以及其基本操作。
本文将介绍汇编语言上机环境的安装和基本操作的步骤,并给出一些示例。
1. 汇编语言上机环境的安装在搭建汇编语言的上机环境之前,我们首先需要确认计算机的操作系统。
通常,我们可以在Windows操作系统上进行汇编语言的开发和调试。
下面是汇编语言上机环境的安装步骤:1.1 下载汇编语言开发工具汇编语言开发工具有很多种,比如MASM、NASM等。
根据个人的喜好和需求选择合适的工具进行下载。
1.2 安装汇编语言开发工具双击下载文件并按照提示完成安装过程。
一般来说,安装过程中可使用默认配置,无需特殊设置。
1.3 配置环境变量配置环境变量可以使得我们在任意路径下都可以运行汇编语言代码。
找到系统环境变量中的"Path"变量,添加汇编语言开发工具的安装路径。
例如,如果您选择了MASM,将其安装路径添加到"Path"变量中即可。
安装好汇编语言开发工具后,我们就可以开始进行汇编语言的实践了。
2. 汇编语言的基本操作接下来我们将介绍汇编语言的一些基本操作,包括编写代码、汇编、链接和运行等。
2.1 编写汇编语言代码打开一个文本编辑器(如记事本),编写汇编语言的代码。
汇编语言与高级语言相比,语法更为底层,需要对计算机的底层结构有一定的了解。
可以参考相关教材或者网络资源,编写简单的汇编语言代码。
2.2 汇编将编写好的汇编语言代码保存为.asm文件。
然后,打开命令提示符(或者使用汇编语言开发工具自带的命令行工具),进入.asm文件所在目录,并执行如下命令进行汇编:> asm 文件名.asm汇编成功后,将生成相应的.obj文件。
2.3 链接汇编语言代码中可能会引用一些外部的库文件,我们需要将这些库文件与生成的.obj文件进行链接。
32位汇编指令
用OD和CE,总不断找汇编资料,解读指令,实在是累。
总算找到篇比较完整的资料,与大家分享。
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
第6章32位指令及其编程
第6章
6.1.1 32位寄存器组
8个32位通用寄存器: EAX EBX ECX EDX ESI EDI EBP ESP 6个16位段寄存器: CS SS DS ES FS 32位指令指针寄存器:EIP 32位标志寄存器:EFLAGS 其他的32位系统用寄存器
基 在 础 原 上 GS 有 扩 16 展 成位 为寄 32 存 位器
第6章
条件转移
转移范围可达到32位全偏移
Jcc label ;cc为真,转移到label指定的段内偏移地址处
JECXZ label ;ECX=0,转移到label指定的段内偏移地址处 LOOP/LOOPZ/LOOPNZ label ;循环指令,32位段采用ECX作为计数器
转移范围仍为短转移
例6.1
字节交换指令
BSWAP r32 ;将32位通用寄存器值的第 1和4字节、第2和3字节互换
mov eax,00112233h bswap eax
;EAX=00112233h ;EAX=33221100h
第6章
送CF标志,然后对那一位复位 bt eax,5 ;EAX=12345678h,CF←1=EAX的D5位
BTSbtc eax,10 ;EAX=12345278h,CF←1=EAX的D10位 dest,src ;把dest中由src指定的位
送CF标志,然后对那一位置位 btr eax,20 ;EAX=12245278h,CF←1=EAX的D20位
第6章
6.1.2 32位存储器寻址方式
32位有效地址= 基址寄存器+(变址寄存器×比例)+位移量
基址寄存器——任何8个32位通用寄存
器之一 变址寄存器——除ESP之外的任何32位 通用寄存器之一 比例——可以是1 / 2 / 4 / 8 位移量——可以是8 / 32位值
罗云彬的Win32汇编教程
罗云彬的Win32汇编教程之一Win32汇编的环境和基础1.32位环境简介在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。
Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。
在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M 的内存,寻址时通过段寄存器来制定段的初始地址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。
而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在最高级--0级中,所有应用程序都工作在3级中(Ring3),在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。
只有对Ring0的程序来说,系统才是全开放的。
在内存方面,Windows使用了处理器的分页机制,使得对应用程序来说,所有的内存都是“平坦”的,你不必用一个段寄存器去指定段的地址,因为在保护模式下,段寄存器的含义是不同的(可以参见80386手册方面的书籍),你可以直接指定一个32位的地址来寻址4GB的内存。
