精华内容
下载资源
问答
  • 【0226】汇编语言概述

    2020-07-03 12:09:18
    指令和数据是应用上的概念,在内存或磁盘上,没有任何区别,是二进制信息. 8比特(二位16进制)=1字节=一个存储单元 每一种CPU有自己的汇编指令集 连接CPU和其他芯片的导线通常称为总线,物理上是导线总和,逻辑上...

    汇编语言概述

    汇编语言的主体是汇编指令[有对应机器码],还包含伪指令[没有对应机器码,编译器执行],其他符号[没有对应机器码,编译器识别]

    工作过程:程序员-汇编指令-编译器-机器码-计算机

    指令和数据是应用上的概念,在内存或磁盘上,没有任何区别,都是二进制信息.

    8比特(二位16进制)=1字节=一个存储单元

    每一种CPU都有自己的汇编指令集

    连接CPU和其他芯片的导线通常称为总线,物理上是导线总和,逻辑上分为地址总线,控制总线,数据总线

    地址总线:N根导线,宽度为N,最多可寻找2的N次方个内存单元,宽度决定寻址能力,一根导线对应一个字节

    数据总线:宽度决定了CPU和外界的数据传送速度,一根导线对应一个bit

    控制总线:宽度决定了CPU对外部器件的控制能力

    能力就是2的N次方,一次传输 N Byte

    8KB的寻址能力,地址总线宽度是13

    课堂笔记

    CPU内部有寄存器,是速度最快的存储场所

    金字塔:寄存器 L1 L2 L3 主存 本地二级存储 外部存储

    汇编语言与处理器密切相关;功能有限,设计硬件细节;本质上是机器语言

    汇编语言优点:直接控制硬件,“时间”,"空间"方面最有效的程序;

    缺点:可移植性差

    CPU=运算器+控制器+寄存器

    16位结构的CPU具有特性:运算器一次最多可处理16位的数据,寄存器的最大宽度为16位,寄存器和运算器之间的通路为16位

    计算机由运算器\控制器\存储器\输入设备\输出设备 ,或者主机和外设,或者CPU\存储器\外设

    机器字长是指计算机中的运算器有多少位

    冯·诺依曼思想的要点有三个方面:

    (1)采用二进制代码形式表示数据和指令;
    (2)采用存储程序方式;
    (3)计算机系统由运算器、控制器、存储器、输入装置和输出装置等五大部件组成。

    不检查的作业:1000位以内的正整数用C语言怎么相加

    Input and output are the same with problem 1001.
    But A and B are big non-negative integers.
    The biggest integer is less than 10^500.

    #include<stdiio.h>
    #include<string.h>
    int main()
    {
        char a[100000],b[100000];
        while(scanf("%s %s",&a,&b)!=EOF)
        {
        int i,c[1000]={0},d[1000]={0},lena,lenb,j;
        lena=strlen(a),lenb=strlen(b);
        for(i=1;i<=lena;i++)
        c[il=a[lena-il-'0'for(i=1;i<=lenb;i++)
        d[i]=b[lenb-i]-'e';
        for(i=i;i<=lenalli<=lenb;i++)
        {
        c[i+1]+=(c[i]+d[i])/10;
        c[i]=(c[i]+d[i])%10;
        }
        lenc=string(c);
        for(i=1;i<=lenc;i++)
               {
                   printf("%c",c[lenc-i])
               }
    }
    
    展开全文
  • 汇编语言是各种CPU所提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是很多相关课程(如:数据结构、操作系统、微机原理等)的重要基础。为了更好地引导、帮助读者学习汇编语言...
  • 一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。 二、初始化的数据段。它包含明确地赋初值的变量。...每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调

    一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。

    二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。

    三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。

    四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)

    五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:


    https://img-my.csdn.net/uploads/201204/13/1334298242_4690.jpg


    栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.esp 始终指向栈顶, 栈中的数据越多, esp的值越小.
    堆用于存放动态分配的对象, 当你使用 malloc , new 等进行分配时,所得到的空间就在堆中. 动态分配得到的内存附带有分配信息, 所以你能够 realloc 和 free调它们.
    全局,静态和常量是分配在数据区中的。数据区包括bss和初始化区。
    堆向高内存地址生长
    栈向低内存地址生长
    堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk
    CODE:
    进程在内存中的影像.
          我们假设现在有一个程序, 它的函数调用顺序如下.
          main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...)
          即: 主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3
          当程序被操作系统调入内存运行, 其相对应的进程在内存中的影像如下图所示.
            (内存高址)
            +--------------------------------------+
            |             ......                   | ... 省略了一些我们不需要关心的区
            +--------------------------------------+
            | env strings (环境变量字串)          | /
            +--------------------------------------+ /
            | argv strings (命令行字串)           |   /
            +--------------------------------------+    /
            | env pointers (环境变量指针)         |    SHELL的环境变量和命令行参数保存区
            +--------------------------------------+    /
            | argv pointers (命令行参数指针)      |   /
            +--------------------------------------+ /
            | argc (命令行参数个数)               | /
            +--------------------------------------+
            |            main 函数的栈帧           | /
            +--------------------------------------+ /
            |            func_1 函数的栈帧         |   /
            +--------------------------------------+    /
            |            func_2 函数的栈帧         |     /
            +--------------------------------------+      /
            |            func_3 函数的栈帧         |      Stack (栈)
            +......................................+      /
            |                                      |     /
                          ......                        /
            |                                      |   /
            +......................................+ /
            |            Heap (堆)                 | /
            +--------------------------------------+
            |        Uninitialised (BSS) data      | 非初始化数据(BSS)区
            +--------------------------------------+
            |        Initialised data              | 初始化数据区
            +--------------------------------------+
            |        Text                          | 文本区
            +--------------------------------------+

    (内存低址)
            这里需要说明的是:
            i)   随着函数调用层数的增加, 函数栈帧是一块块地向内存低地址方向延伸的.
                 随着进程中函数调用层数的减少, 即各函数调用的返回, 栈帧会一块块地
                 被遗弃而向内存的高址方向回缩.
                 各函数的栈帧大小随着函数的性质的不同而不等, 由函数的局部变量的数目决定.
            ii) 进程对内存的动态申请是发生在Heap(堆)里的. 也就是说, 随着系统动态分
                 配给进程的内存数量的增加, Heap(堆)有可能向高址或低址延伸, 依赖于不
                 同CPU的实现. 但一般来说是向内存的高地址方向增长的.
            iii) 在BSS数据或者Stack(栈)的增长耗尽了系统分配给进程的自由内存的情况下,
                 进程将会被阻塞, 重新被操作系统用更大的内存模块来调度运行.
                 (虽然和exploit没有关系, 但是知道一下还是有好处的)
            iv) 函数的栈帧里包含了函数的参数(至于被调用函数的参数是放在调用函数的栈
                 帧还是被调用函数栈帧, 则依赖于不同系统的实现),
                 它的局部变量以及恢复调用该函数的函数的栈帧(也就是前一个栈帧)所需要的
                 数据, 其中包含了调用函数的下一条执行指令的地址.
            v)   非初始化数据(BSS)区用于存放程序的静态变量, 这部分内存都是被初始化为零的.
                 初始化数据区用于存放可执行文件里的初始化数据.
                 这两个区统称为数据区.
            vi) Text(文本区)是个只读区, 任何尝试对该区的写操作会导致段违法出错. 文本区
                 是被多个运行该可执行文件的进程所共享的. 文本区存放了程序的代码.
        2) 函数的栈帧.
           函数调用时所建立的栈帧包含了下面的信息:
           i)   函数的返回地址. 返回地址是存放在调用函数的栈帧还是被调用函数的栈帧里,
                取决于不同系统的实现.
           ii) 调用函数的栈帧信息, 即栈顶和栈底.
           iii) 为函数的局部变量分配的空间
           iv) 为被调用函数的参数分配的空间--取决于不同系统的实现.




    程序1:

    #include <stdio.h>
    #include <stdlib.h>
    
    char *GetString(void)
    {
    	char p[] = "Hello, World";
    	return p;
    }
    
    int main(void)
    {
    	char *str = NULL;
    	str = GetString();	
    	printf("%s\n", str);
    }
    
    上面的程序例子,是错误的。因为 char p[] = "Hello, World"; 数组占有的空间在函数GetString()调用后,将会把收回,所以是错误的。一般编译器会报出这样的错误, warning: function returns address of local variable,因此说,千万不能用return语句返回指向“栈内存”的指针。

    然后我再说一下堆的应用吧。

    程序二

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    char *GetString(int num)
    {
    	char *p = (char *)malloc(sizeof(char)* num);
    	return p;
    }
    
    
    int main(void)
    {
    	char *str = NULL;
    	str = GetString(100);
    	strcpy(str, "Hello, World");
    	printf("%s\n", str);
    	free(str);
    }

    在程序二中,GetString()申请空间,函数被调用结束后,不会被释放。故空间可以被使用。因此可以说,用return语句可以返回指向“堆内存”的指针。



    这是一个前辈写的,非常详细
    //main.cpp
    int a = 0; 全局初始化区
    char *p1; 全局未初始化区
    main()
    {
    int b; 栈
    char s[] = "abc"; 栈
    char *p2; 栈
    char *p3 = "123456"; 123456\0在常量区,p3在栈上。

    static int c =0; 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    }


    展开全文
  • c程序中存储空间布局

    千次阅读 2012-04-13 14:21:02
    一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。 二、初始化的数据段。它包含明确地赋初值的变量。...每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调

    一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。

    二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。

    三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。

    四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)

    五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:


                               

    我们首先说一下,栈的应用。

    程序1:

    #include <stdio.h>
    #include <stdlib.h>
    
    char *GetString(void)
    {
    	char p[] = "Hello, World";
    	return p;
    }
    
    int main(void)
    {
    	char *str = NULL;
    	str = GetString();	
    	printf("%s\n", str);
    }
    
    上面的程序例子,是错误的。因为 char p[] = "Hello, World"; 数组占有的空间在函数GetString()调用后,将会把收回,所以是错误的。一般编译器会报出这样的错误, warning: function returns address of local variable,因此说,千万不能用return语句返回指向“栈内存”的指针。

    然后我再说一下堆的应用吧。

    程序二

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    char *GetString(int num)
    {
    	char *p = (char *)malloc(sizeof(char)* num);
    	return p;
    }
    
    
    int main(void)
    {
    	char *str = NULL;
    	str = GetString(100);
    	strcpy(str, "Hello, World");
    	printf("%s\n", str);
    	free(str);
    }

    在程序二中,GetString()申请空间,函数被调用结束后,不会被释放。故空间可以被使用。因此可以说,用return语句可以返回指向“堆内存”的指针。


    展开全文
  • windows用户称拦截api

    2015-04-06 17:22:24
    理论上只要改变api入口和出口的任何机器码,可以拦截该api。这里我选择最简单的修改方法,直接修改qpi入口的前十个字节来实现跳转。为什么是十字节呢?其实修改多少字节没有关系,只要实现了函数的跳转之后,你...
  • 出某些请求,比如移动、战斗等指令都是通过封包的形式和服务器交换数据。那么我们 把本地发出消息称为SEND,意思就是发送数据,服务器收到我们SEND的消息后,会按照 既定的程序把有关的信息反馈给客户端,比如,移动...
  • 2个做法不会留下任何信息在内存里,所以不会有任何问题。  2、CodeBreaker  CB码正确的输入位置应该是“修改译码”(图中的D)。许多人分不清CB和GS,往往写到“金手指”里,虽然在后期的模拟器里可以识别,但...
  • 作者详细阐述了如何借助这些工具找出问题的真实原因——这比使用其他任何调试器将节省大量的调试时间。作者首先介绍了在使用.NET非托管调试器时的一些关键概念。接下来介绍了许多巧妙的调试技术,并且通过真实的...
  • 2004-2010软考程序员真题

    热门讨论 2012-09-27 12:33:00
     D)地址总线上除传送地址信息外,不可以用于传输控制信息和其它信息  23、下列四个不同数制表示的数中,数值最大的是  A)二进制数11011101 B)八进制数334 C)十进制数219 D)十六进制数DA  24、设WlndowS 98桌面上...
  • 会计理论考试题

    2012-03-07 21:04:40
    C、CPU能接受的基本指令 D、接近自然语言的计算机指令 13.下列关于计算机病毒的说法中,正确的是 __A___ 。 A、计算机病毒通常是一段可运行的程序 B、反病毒软件可清除所有病毒 C、加装防病毒卡的微机不会感染病毒 D...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ===>mount -t ext2 /dev/fd0 /mnt/floppy cdrom ===>mount -t iso9660 /dev/hdc /mnt/...
  • chrome.exe

    2020-04-01 09:26:11
    Chrome 31.0.1650.63包含15个安全修复,例如同步会话的302定向、v8缓冲区溢出、模态对话框中的地址栏欺诈…… Chrome 31支持Web支付,在用户的授权下,Web开发人员可以通过程序调用浏览器的自动填充数据。这样,在...
  • 虽然一次交互可能包含多次网络请求,不过带来的好处是:每一个环节可以被修改和定制。而且我认为,到了 5G 时代,音箱的响应速度将不再成为体验问题。可定制和个性化才是未来的主流,而届时 wukong-robot 将会是更...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 ... 比尔.... 2000 年 6 月 ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.10 同一个静态(static)函数或变量的所有声明必需包含static存储类型吗? 1.11 extern在函数声明中是什么意思? 1.12 关键字auto到底有什么用途? 类型定义(typedef) 1.13 对于用户定义类型,typedef和#...
  • windows 程序设计

    2011-07-24 21:16:30
    任何Windows的历史介绍必须包括一些OS/2的说明,OS/2是对DOS和Windows的另一种选择,最初是由Microsoft和IBM合作开发的。OS/2版本1.0(只有文字模式)在Intel 286(或者后来的)微处理器上运行,在1987年末发布。...
  • C#微软培训资料

    2014-01-22 14:10:17
    <<page 1>> page begin==================== 目 目目 目 录 录录 ... 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界将成为值得纪念的一天 这一天 微软公司正式推出了其下一代...
  • 1.10 同一个静态(static)函数或变量的所有声明必须包含static存储类型吗?  1.11 extern在函数声明中是什么意思? 1.12 关键字auto到底有什么用途? 类型定义(typedef)  1.13 对于用户定义类型,typedef和#...
  •  存储类型 1.10 同一个静态(static)函数或变量的所有声明必须包含static存储类型吗? 1.11 extern在函数声明中是什么意思? 1.12 关键字auto到底有什么用途? 类型定义(typedef) 1.13 对于用户定义类型,...
  • 1.10 同一个静态(static)函数或变量的所有声明必须包含static存储类型吗? 35 1.11 extern在函数声明中是什么意思? 35 1.12 关键字auto到底有什么用途? 36 类型定义(typedef) 36 1.13 对于用户定义类型,...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

任何机器指令都包含地址信息