精华内容
下载资源
问答
  • 汇编常用寄存器

    2021-12-03 22:33:51
    汇编寄存器主要分两类,通用寄存器和特殊功能寄存器。         通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,保存运算结果。除此之外,它们还各自具有


            汇编寄存器主要分两类,通用寄存器特殊功能寄存器
            通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。16位cpu通用寄存器共有8个:AX、BX、CX、DX、BP、SP、SI、DI。32位cpu通用寄存器共有8个: EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI功能和16位CPU差不多。

    一、数据寄存器(AX、BX、CX、DX寄存器)

            AX、BX、CX、DX可以称作数据寄存器,这4个16位寄存器又可分别分成高8位(AH、BH、CH、DH)和低8位(AL、BL、CL、DL)。因此它们既可作为4个16位数据寄存器使用,也可作为8个8位数据寄存器使用。在编程时可存放源操作数、目的操作数或运算结果。数据寄存器是存放操作数、运算结果和运算的中间结果,以减少访问存储器的次数,或者存放从存储器读取的数据以及写入存储器的数据的寄存器。

    • AX(accumulator)累加器。是算术运算的主要寄存器。在乘、除等指令中指定用来存放操作数,以及所有的 I/O指令都使用这一寄存器与外部设备传送信息。
    • BX(base)基址寄存器。常做存放地址使用。
    • CX(count)计数器。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器。
    • DX(data)数据。一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位数。对于某些I/O操作,DX可用来存放I/O的端口地址。

    上述寄存器均可用作通用寄存器。

    二、变址寄存器(SI寄存器、DI寄存器)

            SI是源变址寄存器,DI是目的变址寄存器。一般用来存放地址偏移,也可以用来存放数据。但需要注意的是:在串处理指令中,SI用作隐含的源串地址,默认在DS中;DI用做隐含的目的串地址,默认在ES中;此时不能混用。

    mov ax,1000H
    mov ds,ax
    mov si,2
    mov ax,[si]   ! ds:si = 1000H + 2
    

    即把ds偏移2位置数据取出赋值给ax。

    三、指针寄存器(BP寄存器、SP寄存器)

    • SP(stack pointer)堆栈寄存器,SP寄存器存放栈的偏移地址。
    • BP(base pointer)基数指针寄存器BP,它的用途有点特殊,需和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到。比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.

    BP作为基址寄存器,一般在函数中用来保存进入函数时的SP的栈顶基址。
    每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复SP和BP的值。

    
    在函数进入时:
    push bp     !! 保存BP指针
    mov bp,sp   !! 将SP指针传给BP,此时BP指向SP的基地址。
                !!  这个时候,如果该函数有参数,则[bp + 2*4]是该子函数的第一个参数;
                !! [bp+3*4]是该子函数的第二个参数,以此类推,有多少个参数则[bp+(n-1)*4].....
    .....
    函数结束时:
    mov sp,bp   !! 将原sp指针传回给sp
    pop bp      !! 恢复原bp的值。
    ret         !! 退出子函数
    

    四、段寄存器(DS寄存器、ES寄存器)

            DS(Data Segment)和 ES(Extra Segment)都属于段寄存器,用于存放的就是某个段地址。

    下面看一个介绍使用 DS 寄存器的 Demo:

    ASSUME CS:CODES
    
    CODES SEGMENT
       
    START:
    
        MOV AX,1000H
        MOV DS,AX
        MOV AL,1
        MOV BX,0
        
        MOV CX,5			;设计一个循环,让其循环 5 次
        s: MOV [BX],AL		;这里 [BX] = (DS:BX)
           INC AL
           INC BX
           LOOP s            
        
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    

    上面的代码所做的事情,就是通过循环将 1,2,3,4,5 写入到地址(1000H:0000H)、(1000H:0001H)、(1000H:0002H)、(1000H:0003H)、(1000H:0004H)。

    注:CPU不支持直接将立即数送入段寄存器中,如下操作方式不合法:

    MOV DS,1000H			!! 非法操作
    
    展开全文
  • 记录地址寄存器的使用,用下面的例题来说明具体的使用方法。 例题 将内存ffff:0-ffff:f 内存单元中的数据复制到0:200-0:20f; 分析: ds寄存器:记录数据从哪里来; es寄存器:记录数据到哪里去。 assume cs:code ...

    记录段地址寄存器的使用,用下面的例题来说明具体的使用方法。

    例题

    将内存ffff:0-ffff:f 内存单元中的数据复制到0:200-0:20f;
    分析:
    ds寄存器:记录数据从哪里来;
    es寄存器:记录数据到哪里去。

    assume cs:code 
    
    	code segment
    	mov ax,0ffffh
    	mov ds,ax     ; 数据从ds中来 
    	
    	mov ax,20h
    	mov es,ax      ; 数据到es中去 
    
    	mov bx,0      ; 0-16
    	mov cx,16     ; loop 计数器
    setNumber:
    	
    	mov dl,ds:[bx]
    	mov es:[bx],dl
    	inc bx
    	loop setNumber
    	
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

    结果如下:
    在这里插入图片描述
    -d 0:200 20f
    这个代码可以继续优化,方法如下;
    在这里插入图片描述
    修改代码如下:

    assume cs:code 
    
    	code segment
    	mov ax,0ffffh
    	mov ds,ax     ; 数据从ds中来 
    	
    	mov ax,20h
    	mov es,ax      ; 数据到es中去 
    
    	mov bx,0      ; 0-16
    	mov cx,8     ; loop 计数器
    setNumber:
    	
    	mov dx,ds:[bx]
    	mov es:[bx],dx
    	add bx,2
    	loop setNumber
    	
    	mov ax,4c00h
    	int 21h
    code ends
    end
    

    执行前
    在这里插入图片描述
    执行后
    在这里插入图片描述

    展开全文
  • 汇编——寄存器的分类和功能

    千次阅读 2021-01-01 20:59:45
    汇编中,个人感觉最重要的部分其实就是寄存器了,这次我们了解一下寄存器的分类和功能。 先说一下寄存器是什么吧,其实就是一部分的空间,我们可以使用这些空间来存储内容。 寄存器的空间都是16位的(80x86中,...

    在汇编中,个人感觉最重要的部分其实就是寄存器了,这次我们了解一下寄存器的分类和功能。
    先说一下寄存器是什么吧,其实就是一部分的空间,我们可以使用这些空间来存储内容
    寄存器的空间都是16位的(80x86中,后来有增长),也就是1个字的空间。

    堆栈则有一点不一样,我们的堆栈空间是在程序中定义的,可以存储很多个16位二进制数。
    注意事项

    1. 堆栈的栈顶指针最开始是在栈顶的,栈顶为高位,也就是存储是从高到低的。
    2. 我们压栈出栈的过程本质上其实就是将我们寄存器的内容进行复制,而不是将寄存器就行移动(不会真的有人感觉是将寄存器拿走了吧,像数据结构那样)

    我们一般将寄存器分为:通用寄存器、变址寄存器、指针寄存器和专用寄存器,最后还有一个段寄存器。

    通用寄存器

    就是我们经常拿来进行数据存放、数据使用的段,一共有四个:AX、BX、CX、DX。
    AX:累加器,一般是用于计算
    BX:基址寄存器,用来存放存储器地址
    CX:计数器,循环操作中常用
    DX:数据寄存器,在dos功能调用(比如输出显示)、乘除法中,都用来存储数据,作为默认项(乘除法的指令中我们默认的结果存放位置就有dx寄存器),还可以作为双字数据的高位。(比如一个32位数,我们就可以将16-31放在DX,低位习惯放在AX中)

    (当然除了这些特殊性的行为,剩下的情况中这些寄存器基本上没有区别。)

    上述的寄存器都是可以进行拆分的(其他的都不行),AX = AH+AL。
    也就是我们可以将AH和AL当成两个8位的寄存器进行使用。

    变址寄存器

    比如数组,或者更具体的字符串,因为寄存器每次只能存储16位数据,所以一个字符串应当一位位的读取(尤其是字符串类型为 dw ),这里就涉及到了一个变址的问题,也就是在数组名这个地址基础上,我们当前的位置进行了多少的移动。
    寄存器:SI(源寄存器)和DI(目的寄存器)

    如果只有一个数组,两个寄存器用起来差不多,我们一般将SI/DI和DS联用(DS是后面讲的段寄存器),来确定数据段中某一个存储单元的地址。

    如果是两个字符串操作,比如字符串的复制操作,我们就需要将原串放在SI,目的串放在DI,调用指令来处理。
    而且一般我们将SI与DS段寄存器联用,用来确定源操作数的地址,DI与ES段寄存器联用,用来确定目的操作数的地址

    程序:将mess2复制为mess1
    在这里插入图片描述
    这里我们使用的指令为lea,将数组的首地址给寄存器的意思。
    cx寄存器放置的就是整个数组的大小,也就是我们需要移动的元素个数。
    cld指令确定字符串是从左到右的顺序,rep movsb是循环指令,在字符串操作中常用的。

    可以看出,我们并没有对si和di 的值进行修改,这是因为两者是可以自增的。

    指针寄存器

    之前提到的堆栈,我们所需要的指针就是存储在指针寄存器中。
    指针寄存器分为两个,
    一个是SP:堆栈指针寄存器,用于存放栈顶指针的位置
    另一个是BP:基址指针寄存器,用于寻找栈内的元素。

    比如我将几个元素都进行了压栈,然后发现自己需要栈内的一个元素,那么我们就可以修改SP指针,或者是使用SP指针来进行寻址,比如[SP+8]这样的方式。

    专用寄存器

    专用寄存器分为两大部分,首先是指令指针寄存器,然后是标志寄存器。

    怎么还有指针寄存器?
    我们的代码部分,如果在子程序或者循环部分进行单步调试查看IP寄存器的内容,可以发现在进行跳转的过程中IP指针发生了跳动,而正常情况下则是不断自增
    我们要知道,其实在我们一行行的实现程序的过程中,我们的一条条指令都是有一个地址存放的,这样就需要有一个指针来指向当前的指令位置,方便我们取出,进行操作。这个寄存器就是IP寄存器。
    IP寄存器在存储指令地址的时候,还有一个CS的段寄存器进行辅助,用来判断是哪一个代码段(我们可能不止一个代码段),这就和地址跳转扯上了关系,这里不多说,给出博客链接,感兴趣看一下,不看也不影响。

    另一个标志寄存器FLAGS,存储了一些标志位,分为两种。
    第一种:状态标志

    1. 进位标志CF
    2. 零标志ZF
    3. 符号标志SF
    4. 奇偶标志PF
    5. 溢出标志OF

    其中CF又称为无符号数的溢出,而OF为有符号数的溢出。
    几点前提:

    • 溢出只能发生在同类型相加或者不同类型相减
      如果是无符号数,那么就只可能是在相加时溢出。
    • a求补得到-a,再次求补为a

    不论是有符号数还是无符号数,程序不需要知道,程序员知道就行;
    程序员不需要知道结果是多少,只需要看数据类型对应的溢出标志位是0还是1,就能知道结果是否正确(虽然溢出了某种程度上也算正确)。

    第二种是控制标志

    1. 方向标志DF
    2. 中断允许标志IF
    3. 陷阱标志TF

    方向标志是在字符串操作中,我们通过这个标志位的数据来决定串的遍历方向,DF = 0则是从低到高。

    中断允许标志控制外部可屏蔽中断是否可以被处理器响应,听起来有一点玄学,主要是用于中断的优先级问题上,这个开始还用不到,等到功能调用时中断会比较常见。(IF = 1,优需中断)

    陷阱标志位TF
    控制处理器是否进入单步操作方式,TF = 1,进入。
    说白了其实就是单步调试的问题,单步过程中每运行一条指令就给一个单步中断,让处理器停止工作,等待下一条指令。

    段寄存器

    段寄存器主要就是确定该段在内存中的起始位置,感觉段寄存器和其他的寄存器就有一点像数组首地址和偏移地址的感觉。

    主要原因还是8086的地址线为20条,但是我们的寄存器只有十六位,多的4位也不好不用,所以我们就采取了物理地址 = 段地址+偏移地址的寻址方式。
    其中的段地址就在这些段寄存器中,而偏移地址的求法就千奇百怪了,在寻址的博客中有详细讲解,不影响我们的介绍。

    段寄存器分为四个:

    • 代码段寄存器CS,和IP配合找到下一条指令的位置。
    • 数据段寄存器DS,能用来干很多事。
    • 堆栈段寄存器SS,和SP配合寻找栈顶。
    • 附加段寄存器ES,和DI配合用于串指令。

    其中的CS和SS主要是针对多个代码段和堆栈段时,如何知道我们当前是哪个段的哪个位置。
    DS就是万金油的感觉,在寻址过程中很多情况下的默认段寄存器都是DS。
    ES用的会比较少,但是在串部分,我们会将es和di配合使用。

    上面的寄存器肯定是不全,下面我们给出一个比较全的默认组合:

    1. CS IP
    2. SS SP or BP
    3. DS BX、DI、SI或一个16位数
    4. ES DI(用于串指令)

    总结

    这样我们就介绍了8086的寄存器种类,简单讲述了分工。
    有一些确实只是在特定的情况下才会遇到,直接上去说就会显得很繁琐,碰到具体问题会进行详细阐述的。

    展开全文
  • 你说你对原因感兴趣,所以:在实模式中,是物理存储器的64K“窗口”,这些窗口间隔16个字节.在受保护模式下,是物理或虚拟内存的窗口,其大小和位置由操作系统确定,并且具有许多其他属性,包括进程必须具有的访问权限...

    你说你对原因感兴趣,所以:

    在实模式中,段是物理存储器的64K“窗口”,这些窗口间隔16个字节.在受保护模式下,段是物理或虚拟内存的窗口,其大小和位置由操作系统确定,并且具有许多其他属性,包括进程必须具有的访问权限级别.

    从这里开始,我所说的一切都是指保护模式.

    内存中有一个称为全局描述符表(GDT)的表,它保存有关这些窗口大小和位置以及其他属性的信息.每个进程可能还有本地描述符表,它们的工作方式类似,所以我只关注GDT.

    加载到段寄存器中的值称为段选择器.它是GDT或LDT的索引,带有一些额外的安全信息.当然,如果程序试图加载超出GDT范围的描述符,则会发生异常.此外,如果进程没有足够的权限来访问该段,或者其他内容无效,则会发生异常.

    发生异常时,内核会处理它.这种异常可能被归类为分段错误.操作系统会杀死你的程序.

    最后一点需要注意:在x86指令集中,您无法将立即值加载到段寄存器中.必须将中间寄存器或内存操作数或POP用于段寄存器.

    MOV DS, 160 ;INVALID - won't assemble

    MOV AX, 160 ;VALID - assembles, but will probably result in an

    MOV DS, AX ;exception, and thus the death of your program

    我认为应该指出,该架构允许大量的细分市场.但AFAIK,在主流x86操作系统方面,段寄存器仅用于几个目的:

    >安全机制,例如防止用户空间进程相互伤害或操作系统

    >处理多核/多核处理器

    >线程本地存储:作为优化,某些操作系统(包括Linux和Windows)使用段寄存器进行线程本地存储(TLS).由于线程共享相同的地址空间,因此线程很难“知道”其TLS区域在何处不使用系统调用或浪费寄存器……但由于段寄存器实际上没用,所以“浪费”没有坏处它们是为了快速TLS.请注意,设置此操作时,操作系统可能会跳过段寄存器并直接写入描述符高速缓存寄存器,这是用于缓存由段寄存器引用触发的GDT / LDT查找的“隐藏”寄存器,在这种情况下,如果您尝试要从段寄存器中读取,您将看不到它.

    除了用于TLS的每个线程的段之外,实际上只使用少数段(处理器的数量),并且仅由OS执行.应用程序可以完全忽略段寄存器.

    这是由于OS设计,而不是任何技术限制.可能有嵌入式操作系统需要用户空间程序来处理段寄存器,尽管我不知道.

    展开全文
  • 汇编寄存器详解

    2021-05-10 15:19:22
    "字"在寄存器中的存储 8086是16位CPU,8086的字长为16bit 一个字可以存在一个16位寄存器中 字的高位字节存在这个寄存器的高8位寄存器 字的低位字节存在这个寄存器的低8位寄存器 通用寄存器 AX 累加器 BX基址...
  • 前言 当CPU在访问内存单元的时候,需要给出内存单元的地址。所有内存单元构成了一个一维的线性地址空间,每个内存单元在整个空间都有一个唯一的地址,这个唯一的地址被称之为物理地址。...寄存器和运
  • 标志寄存器 ZF:zero falg零标志位,判断运算结果是否为0,ZF=1,意味着运算结果为0,ZF=0,意味着运算结果为1 PF:奇偶标志位,判断运算结果1的个数是否为偶数 SF:sign flag符号标志位,判断运算结果是否为负,对象是有...
  • 文章目录一、汇编语言二、指令数据传输指令栈操作指令pushpop运算指令位操作比较操作指令标志寄存器流控制指令三、伪指令.equ.rept.endr.lcomm.globl.type.ascii.byte.section变量四、X86_64寄存器五、常见汇编结构1...
  • 在学习汇编语言时,我们知道1个程序中寄存器其实是对应CPU中的1个硬件寄存器的,由于寄存器是在CPU中的,访问速度比内存条还快,所以寄存器是一个很稀缺的资源,数量少,intel在设计寄存器时,基本上也规定了这些...
  • 汇编语言-寄存器

    2021-10-22 15:27:23
    寄存器是CPU中程序员可以用指令读写的部件,CPU的主要部件是寄存器,程序员通过改变各种寄存器的内容来实现对CPU的控制 CPU由运算器、控制器、寄存器等器件构成,器件通过总线连接,第一章描述的地址、控制、命令...
  • 段寄存器

    千次阅读 2021-01-15 12:46:20
    一、段寄存器有哪些 ? 段寄存器有ES、CS、SS、DS、FS、GS、LDTR、TR共8个。 通常我们用汇编读写某一个地址时,如下: Mov dword ptr ds:[0x123846],eax 这时我们把eax 的值往地址去写,写的地址是: ds.base +...
  • 汇编语言 - 内存访问 本篇主要为寄存器和内存中相互传送数据,文章涉及的CPU为8086,文章中涉及到的内存地址皆为16进制 前言 在CPU中,用16位的寄存器来存储字型数据,用8位的寄存器来存储字节型数据 在内存中,用...
  • 汇编寄存器的详解

    2021-02-25 19:58:07
    1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。...
  • 汇编常见寄存器以及标志位 通用寄存器 简写 英文全称 中文 作用 AX accumulator 累加器 存放操作数,与外部设备 BX base 通用寄存器 基址寄存器(计算存储器地址时用) CX count 通用寄存器 保存计数值...
  • 汇编寄存器介绍

    2021-11-07 10:50:27
    1. 通用寄存器 名称 全称 32位 16位 8位 编号 功能 %rax 累加器(Accumulator) %eax %ax %ah %al 0 (0000) 返回值 %rcx 计数器(Count Register) %ecx %cx %ch %cl 1 (0001) 第二个参数 %rdx 数据...
  • [从零学习汇编语言] -寄存器详解

    千次阅读 多人点赞 2021-10-27 20:58:07
    [汇编语言] - 汇编语言基础知识梳理 一、 存储器与通用寄存器 1. 存储器 每一天清晨,当我们在梦中醒来的时候,记忆就会填充大脑的空白,我们会想起最近做过的一些重要的事情,当然也有些小的事情无法准确的记忆起...
  • 16位汇编通用寄存器

    2021-08-18 11:13:00
    调试实验 1、输入命名debug,进入调试程序 ...1.写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=2627H mov ah,31H AX=3127H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mo.
  • 当然,你也可以进行汇编级的调试。理论上这个更应该有用。(因为很多程序的编译常常没有源码级别的调试信息)那么怎么做?先写一个最简单的源代码。$ cat > a.cint main(void){int i = 0;i = 2;return 0;}Ctrl + D ...
  • ARM汇编:初识寄存器

    2021-03-19 20:45:13
    文章目录CPU内存寄存器(arm) 汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令。 CPU 地址总线:它的宽度决定CPU寻址能力,最大为2的总线宽度次方。8086宽度20,所以最大寻址为2的20次方为1M。 ...
  • 段寄存器的种类和作用: 1、代码段寄存器CS,用于存放当前正在运行的程序代码所在。 2、数据段寄存器DS,用于存放数据。 3、堆栈段寄存器SS,存放堆栈。 4、附加段寄存器ES,存放当前程序使用附加数据。...
  • 汇编语言中的AX、BX、CX、DX是CPU内部的通用寄存器中的数据寄存器助记符。 数据寄存器用来存放参与运算的数据或是存储运算的结果。这四个数据寄存器都是16位的,实际由两个8位寄存器组合而成,这是为了灵活处理8位...
  • 汇编语言】寄存器和地址

    千次阅读 多人点赞 2021-03-04 18:40:57
    寄存器和地址 主要内容: 一、寄存器 (1)透明寄存器 (2)可编程寄存器 1.通用寄存器 2.专用寄存器 二、地址 (1)存储模型 (2)存储空间分段管理 (3)物理地址与逻辑地址 (4)操作数寻址过程
  • 汇编语言(一)- 寄存器 80x86寄存器组 80x86是Intel一系列cpu的代称,其中8088,8086,80286为16位cpu,80386为32位...程序可见的寄存器共分为:8个通用寄存器,2个专用寄存器,4个段寄存器共14个。 其体系大致如下:
  • 在发送stack corruption时,可以通过sp在c中监控stack的数值 Linux 内核中对特殊寄存器的读取 #define read_sysreg(r) ({ \ u64 __val; \ asm volatile("mrs %0, " __stringify(r) : "=r" (__val)); \ __val; \...
  • 1、通用寄存器组 (1)数据寄存器(字或字节):AX、BX、CX、DX  AX:作为累加器使用,算术运算的主要寄存器,在乘、除等指令中指定用来存放操作数。  BX:计算存储器地址时,用作... SP、BP与堆栈段寄存器SS联用
  • 寄存器汇编语言中常常用到的 – 汇编语言需要操作CPU,而寄存器是CPU很重要的一部分,那么今天就来讲一讲常见的寄存器,如AX, AH, AL, FS, IP等 为了好记,我把它们分成几类 AX, BX, CX, DX 16位通用寄存器,...
  • 代码:cs+ip 一般不能直接改变这二者的值,向来由转移指令来改变,用人话来讲就是要你自己通过涉及代码逻辑实现跳转到哪一行代码去。因为cs+ip 就确定了要执行的代码             ...
  • 这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下字的存储一个16位寄存器可以存放一个字(16位)或者一个字节(8位...
  • 文章目录DS寄存器栈 DS寄存器 通常用来存储要访问的地址所在的地址 如欲将CS:IP = 1000:0即10000H的位置的数据读入al中,如下: ; 将1000这个数值送入bx mov bx, 1000H ; 将bx的内容送入ds ; 不能直接将数据送入ds...
  • 不能将一个段寄存器的内容直接送到另一个段寄存器中, 可借助通用寄存器或PUSH, POP指令实现这一要求l PUSH SRC ;压栈指令: 将一个字数据压入当前栈顶, 位移量disp=-2的地址单元. 数据进栈时, 栈指针SP首先向低地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,480
精华内容 57,392
关键字:

汇编段寄存器