32位80x86汇编语言ptr指令学习笔记

合集下载

汇编ptr指令

汇编ptr指令

汇编ptr指令1. 什么是汇编ptr指令在计算机科学中,汇编ptr指令是一种命令,用于处理指针(pointer)。

指针是一种数据类型,用于存储内存地址。

通过指针,我们可以直接访问内存中的数据,而不需要通过变量名。

汇编ptr指令允许程序员直接操作指针,并对指针进行加载、存储和操作。

这使得程序员可以更加灵活地编写汇编语言程序,从而更好地控制内存和数据。

2. 汇编ptr指令的语法汇编ptr指令的语法可以根据具体的汇编语言而有所不同,下面以x86汇编语言为例来介绍常见的汇编ptr指令的语法:2.1 加载指令(Load)mov [destination], [source]加载指令用于将指针指向的内存地址中的值加载到寄存器或其他指针中。

[destination]表示目标寄存器或指针,[source]表示源地址指针。

例如,以下指令将将[ebp+8]处的值加载到eax寄存器中:mov eax, [ebp+8]2.2 存储指令(Store)mov [destination], [source]存储指令用于将寄存器或其他指针中的值存储到指针指向的内存地址。

例如,以下指令将将eax寄存器中的值存储到[ebp+8]处:mov [ebp+8], eax2.3 指针操作指令汇编ptr指令还支持进行指针运算和指针地址的计算。

具体的语法可以根据不同的汇编语言而有所不同。

例如,以下指令将eax寄存器的值乘以4,并将结果存储到edx寄存器中:lea edx, [eax*4]3. 汇编ptr指令的应用示例为了更好地理解汇编ptr指令的应用,下面给出一个示例。

假设我们要编写一个函数,在内存中查找指定值的索引位置。

我们可以使用汇编ptr指令来实现。

以下是一个使用x86汇编语言编写的示例函数:global find_indexsection .textfind_index:mov esi, [ebp+8] ; 指向数组的指针mov ecx, [ebp+12] ; 数组长度mov eax, [ebp+16] ; 要查找的值xor edx, edx ; 初始化索引为0loop_start:cmp eax, [esi+edx*4] ; 比较当前位置的值和要查找的值je loop_found ; 如果相等,跳转到找到值的标签inc edx ; 索引自增1cmp edx, ecx ; 比较索引和数组长度jne loop_start ; 如果索引小于数组长度,继续循环; 如果循环结束都未找到值,则返回-1mov eax, -1retloop_found:mov eax, edx ; 返回找到的索引ret上述示例函数中使用了多个汇编ptr指令来处理指针和内存操作。

汇编语言中PTR的含义及作用

汇编语言中PTR的含义及作用

汇编语言中PTR的含义及作用在汇编语言中,PTR是一个非常重要的指令。

PTR是Pointer(指针)的缩写,用于表示和操作内存地址。

它可以帮助程序员直接访问和操纵内存中的数据,提供了更高级别的内存操作功能。

一、PTR指令的含义PTR指令用于设置和操作指针寄存器。

指针寄存器是用于存储内存地址的寄存器,它们可以指向内存中的某个特定位置,从而使程序能够读取或写入该内存位置的数据。

在汇编语言中,常用的指针寄存器有DS(数据段寄存器)、ES(目标段寄存器)、SS(堆栈段寄存器)等。

二、PTR指令的作用1. 读取和写入内存数据:PTR指令允许程序员通过指针寄存器直接读取或写入内存数据。

通过设置PTR指令的操作数为目标内存地址,程序可以将数据加载到寄存器中,或者将寄存器中的数据存储到目标内存地址中。

示例:```assemblyMOV AX, PTR[BP+DI] ; 将DS:BP+DI地址处的数据加载到AX寄存器中MOV PTR[SI], BX ; 将BX寄存器的值存储到ES:SI地址处```2. 数据传送和复制:PTR指令可以用于在不同段之间进行数据传送和复制操作。

通过设置指针寄存器的值为源和目标段的基地址,程序可以将数据从一个段复制到另一个段,实现不同段之间的数据传递。

示例:```assemblyMOV CX, 200 ; 设置传送数据的长度MOV DS, SRC_SEG ; 设置源段基地址MOV ES, DEST_SEG ; 设置目标段基地址MOV PTR[DI], ES:[SI] ; 复制ES:SI地址处的数据到ES:DI地址处```3. 字符串操作:PTR指令也常用于字符串操作,比如字符串的拷贝、连接和比较等。

通过设置指针寄存器和偏移地址,程序可以对字符串进行各种操作。

示例:```assemblyMOV CX, 100 ; 设置循环计数器MOV DS, SRC_SEG ; 设置源段基地址MOV ES, DEST_SEG ; 设置目标段基地址MOV SI, OFFSET SRC_STR ; 设置源字符串的偏移地址MOV DI, OFFSET DEST_STR; 设置目标字符串的偏移地址REP MOVSB ; 将源字符串复制到目标字符串```四、使用PTR指令的注意事项1. 指针寄存器的值必须正确设置,确保指向有效的内存区域,否则会导致程序运行错误或崩溃。

汇编语言平时练习(判断题)

汇编语言平时练习(判断题)

2.知识点:0301 (80x86的寻址方式)假设存储器中从7462H单元开始的四个相邻字节单元中的内容依次是32H,46H,52H,0FEH,则存放字数据0FE52H的字地址是7465H。

4.知识点:0303(80x86的指令系统)MOV指令不影响标志位。

5.知识点:0303(80x86的指令系统)无条件转移指令对标志位无影响,而条件转移指令对标志位有影响。

6.知识点:0303(80x86的指令系统)指令IN AL,DX是合法的指令。

7.知识点:0303(80x86的指令系统)当运算结果的低8位中有偶数个1 时, 奇偶标志位PF被置为1。

9.知识点:0301 (80x86的寻址方式)可以将一个存储器操作数与另一个存储器操作数相加。

10.知识点:0303(80x86的指令系统)在“IN AL,端口地址”指令中,端口地址指定了某个外部设备接口的I/O地址,它实际上是一个立即数,其范围为0~65535。

答案:错误11.知识点:0401(汇编程序功能)汇编程序和汇编语言源程序是不同的概念。

答案:正确12.知识点:0301 (80x86的寻址方式)相对于某起始地址的偏移量称为偏移地址。

答案:正确13.知识点:0303(80x86的指令系统)只能使用PUSH,POP类的指令对堆栈段内的内容进行操作。

14.知识点:0301 (80x86的寻址方式)立即数寻址方式不能用于目的操作数字段。

15.知识点:0203(中央处理机)BP是堆栈栈顶指针寄存器。

16.知识点:0301 (80x86的寻址方式)内存中字单元的地址必须是偶数地址。

答案:错误17.知识点:0303(80x86的指令系统)PUSH AL。

19.知识点:0303(80x86的指令系统)SHR AX,CX。

20.知识点:0401(汇编程序功能)汇编程序是用汇编语言编写的汇编语言源程序。

答案:错误22.知识点:0301 (80x86的寻址方式)不能给段寄存器进行立即数方式赋值。

32位汇编语言学习笔记3leal和算术运算指令

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指令:用于将第一个操作数减去第二个操作数,并将结果存储到目标操作数中。

汇编语言第2章80x86计算机组织

汇编语言第2章80x86计算机组织

控制标志位
• 控制标志位 :DF 方向标志,用于串处理指令处理
▪ DF位为1时,每次操作后使变址寄存器SI和 DI减量,使串处理从高地址向低地址方向处 理:
▪ 当DF位为0时,则使SI和DI增量,使串处理 从低地址向高地址方向处理:
系统标志位
• IF:中断标志。 当IF=1时,允许中断; IF=0时关闭中断
数据的宽度 • 地址总线宽度:用以确定可访问的存储器的最
大范围
地址总线宽度
• 10位:210=1024单元,1K • 20位:220=1024* 210单元=1024K,1M • 24位:224=16*1M,16M • 30位:230=1024M,1G • 32位:232=4G,即4GB
二、一些名词术语(2)
• TF:陷井标志(跟踪标志)。用于单步方式操作 • IOPL:I/O特权级。控制对I/O地址空间访问
段寄存器
• 8086/8088、80286:四个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES
• 80386及后继机型:六个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES、 FS、GS---都是16位
• ZF:零标志。运算结果为0,置1;否则置0。 • CF:进位标志。记录从最高有效位产生的进位值。
最高有效位有进位时置1,否则置0。 • AF:辅助进位标志。记录运算时第3位产生的进位
值。如第3位有进位时置1,否则置0。 • PF:奇偶标志。当结果操作数中1的个数为偶数时置
1,否则置0。
标志符号 举例
段中的某一存储单元的地址 4. SI、DI一般与DS联用:
在串处理指令中,SI和DS联用,DI和ES联用
8086系统的堆栈
• 是存储器中的特殊区域 – 在堆栈段内,“FILO” – SP始终指向栈顶,总是字操作,指示栈顶的 偏移地址; – BP可作为堆栈区中的一个基地址以便访问 堆栈中的其他信息

80x86微机原理参考答案

80x86微机原理参考答案

80x86微机原理参考答案第一章计算机基础(P32)1-1电子管,晶体管,中小规模集成电路、大规模、超大规模集成电路。

1-2把CPU和一组称为寄存器(Registers)的特殊存储器集成在一片大规模集成电路或超大规模集成电路封装之中,这个器件才被称为微处理器。

以微处理器为核心,配上由大规模集成电路制作的只读存储器(ROM)、读写存储器(RAM)、输入/输出、接口电路及系统总线等所组成的计算机,称为微型计算机。

微型计算机系统是微型计算机配置相应的系统软件,应用软件及外部设备等.1-3写出下列机器数的真值:(1)01101110 (2)10001101(3)01011001 (4)11001110答案:(1)+110 (2)-13(原码) -114(反码)-115(补码)(3)+89 (4)-78(原码)-49(反码)-50(补码)1-4写出下列二进制数的原码、反码和补码(设字长为8位):(1)+010111 (2)+101011(3)-101000 (4)-111111答案:(1)[x]原=00010111 [x]反= 00010111 [x]补= 00010111(2)[x]原=00101011 [x]反= 00101011 [x]补= 00101011(3)[x]原=10101000 [x]反= 11010111 [x]补= 11011000(4)[x]原=10111111 [x]反= 11000000 [x]补=110000011-5 当下列各二进制数分别代表原码,反码,和补码时,其等效的十进制数值为多少?(1)00001110 表示原码14,反码14,表示补码为14(2)11111111 表示原码-127,反码-0,表示补码为-1(3)10000000 表示原码-0,反码-127,表示补码为-128(4)10000001 表示原码-1,反码-126,表示补码为-1271-6 已知x1=+0010100,y1=+0100001,x2=-0010100,y2=-0100001,试计算下列各式。

汇编语言程序设计_第3章 80x86指令系统

汇编语言程序设计_第3章 80x86指令系统

3.3.2 算术指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC
dest
; dest = dest + 1
语法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
movsx ax, al ; 等价于cbw movsx eax, ax ; 等价于cwde movsx eax, al ; 等价于顺序执行cbw与cwde
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(3)MOVZX 一般形式: MOVZX dest, src ; src零扩展为dest;386新增 语法格式: MOVZX reg16, reg8/mem8 MOVZX reg32, reg8/mem8/reg16/mem16
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
INC
reg/mem
对标志位的影响:
ADD、ADC:按一般规则影响CF、OF、SF和ZF。 INC:不影响CF,其它同ADD。 说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。
2019/8/26

汇编ptr指令

汇编ptr指令

汇编ptr指令一、简介汇编语言是一种低级的计算机语言,它使用符号化的指令来操作计算机硬件。

指令是汇编语言中最基本的单元,而ptr指令则是其中一个重要的指令之一。

二、ptr指令的作用ptr指令可以将一个16位或32位的内存地址加载到一个寄存器中,或者将一个寄存器中的值写入到内存地址中。

它主要用于访问内存中的数据,包括读取和写入。

三、ptr指令的语法在汇编语言中,ptr指令有两种不同的语法形式:1. ptr type [address]这种形式将一个内存地址加载到一个寄存器中,并且需要明确指定数据类型(type)。

2. ptr [address]这种形式将一个内存地址加载到默认寄存器(DS:BX或DS:EBX)中,并且不需要明确指定数据类型。

四、ptr指令示例以下是一些常见的ptr指令示例:1. 将一个16位内存地址加载到AX寄存器中:mov ax, ptr [0x1234]2. 将一个32位内存地址加载到EAX寄存器中:mov eax, ptr [0x12345678]3. 将AX寄存器中的值写入到0x5678处:mov ptr [0x5678], ax4. 将EAX寄存器中的值写入到0x12345678处:mov ptr [0x12345678], eax五、ptr指令的注意事项在使用ptr指令时需要注意以下几点:1. 必须明确指定数据类型,否则会导致数据读取错误。

2. 内存地址必须是有效的,否则会导致程序崩溃。

3. 内存地址必须按照正确的字节顺序进行读取和写入,否则会导致数据错误。

六、总结ptr指令是汇编语言中一个非常重要的指令,它可以用于访问内存中的数据。

在使用ptr指令时需要注意数据类型、内存地址和字节顺序等方面。

熟练掌握ptr指令可以帮助程序员更好地进行汇编语言编程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

阅读反汇编后的汇编程序挺麻烦,尤其是在c语言程序的子函数参数中有数组参数,同时当子函数里有循环操作时,反汇编后的代码中频繁出现ptr指令操作。

该指令的用法十分灵活,有时候读入(或写入)的是某内存地址,有时候读入(写入)的是某内存地址中存储的值,初学时总感觉很迷惑,分不清什么时候读内存地址,什么时候读内存地址中值,参考相关文献和书籍后作如下总结。

例如一段简单的C语言程序:
int mywork(int a[9], int b[9], int c[9])
{
int i;
for ( i=0; i<9; i++)
c[i] =a[i] +b[i];
}
这段代码debug版反汇编后代码很简单,但是里面有许多小细节值得推敲。

int mywork(int a[9], int b[9], int c[9]) ;原c代码
… … ;这里为开始调用函数时当前寄存器数据保存
for ( i = 0 ; i < 9 ; i ++)
mov dword ptr [i], 0;这里为i初始化,值为0
jmp mywork+xx1h ;进入循环体内部
mov eax, dword ptr [i];
add eax, 1
mov dword ptr [i], eax
mywork+xx1h:cmp dword ptr [i], 9
jge mywork+xx2h ;如果i等于或大于9,跳出循环
c[i] =a[i] +b[i];
mov eax, dowrd ptr [i] ;读入参数i
mov ecx, dword ptr [a] ;这里是读入参数数组a的首地址
mov edx, dword ptr [b] ;这里是读入参数数组b的首地址
mov eax, dword ptr [ecx + eax*4] ;读入a
add eax, dword ptr [edx +eax*4] ; eax = a[i]+b[i]
mov edi, dword ptr [c] ;这里是读入参数数组c的首地址
mov dword ptr [edi+ eax*4], eax ;这里保存计算结果,c[i]= a[i]+b[i]
inc eax
jmp mywork+xx1h
mywork+xx2h: … … ;一些数据恢复操作,主要是出栈等
ret
文中用红色标记处两处涉及ptr指令的地方。

第一处为mov eax, dword ptr [i]
本条mov指令的结果是将变量i的值读入到eax寄存器中,至于从i变量存储地址处读取几个字节,由dword修饰符指定(4个字节)。

第二处为mov ecx, dword ptr [a]
这里表示将参数数组a的首地址读入到ecx寄存器中。

同样两个mov 寄存器, dword ptr [变量]操作,为何第一个寄存器eax读入数值,而第二个ecx寄存器读入的为地址呢?
ptr指令会指定并修改当前已分配内存地址的标记,因为i为c语言子函数mywork中定义的int变量,而非外部传入的参数,从而在执行子函数的汇编程序中变量i的值就是保存在dword ptr [i]返回的内存地址中,占用4个字节,所以mov eax, dword ptr [i]指令将源操作数指定的地址中数据(即int变量i的值)读入到eax寄存器中;而第二处中由于数组a的首地址是作为参数传送到mywork中的,在调用mywork前,3个数组参数a、b、c的首地址依次按照c、b、a的顺序被push入栈,并且传递给子函数,因此dword ptr [a]表示数组a作为参数传递给子函数的值,即其起始首地址,并非a[0]的值,从而mov ecx, dword ptr [a]后的结果是把数组a的首地址保存在了ecx中,而非a[0]的值
第一次发读书笔记,如果写的有误请大家指正:)
苏清华,2011.6.28
联系邮箱:suqinghua4587@。

相关文档
最新文档