精华内容
下载资源
问答
  • 文件格式 现在PC平台流行的可执行程序格式,主要是Windows下...一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元)在存储(没有调入到内存运行)时拥有3个部分,分别是代码(text)、数...

    文件格式

    现在PC平台流行的可执行程序格式,主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),这里以Linux下的ELF格式可执行文件为例说明。
    一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。而堆栈段是在程序装入内存后由系统分配的。

    C程序各段

    C程序各个段的意义:

    段名内容
    代码段可执行代码、字符串常量、常量数据
    数据段已初始化全局变量、已初始化全局静态变量、局部静态变量
    BSS段未初始化全局变量,未初始化全局静态变量
    局部变量 函数参数
    动态内存分配

    示例代码

    下面给出示例代码,并通过objdump来查看程序在的分段情况

    源码

    //test.c
    #include <stdio.h>
    #include <stdlib.h>
    const int       g_A =1;  //代码段, 常量
    int             g_B =2;		//数据段, 全局变量
    static int      g_C =3;		//数据段,全局静态变量
    static int      g_D;		//BSS段, 未初始化全局静态变量
    int             g_E;		//BSS段, 未初始化全局变量
    char *        g_p1;			//BSS段, 未初始化全局变量
    int main(int argc, char const * argv[]) 	//栈,函数参数
    {
            int local_A;					//栈,局部变量
            static int local_B = 4;			//数据段,局部静态变量
            static int local_C;				//BSS段,未初始化局部静态变量
    
            char *p2 ="123456";				//“123456”在代码段,
            								//字符串常量, P2在栈上
            g_p1 =(char*)malloc(10);		//申请的10字节空间在堆上
     
            return 0;
    }
    
    

    详细分析

    1. 编译生成目标文件
    crab@ubuntu:~/Example/Ctest$ gcc -c test.c
    
    1. 通过size查看内存分布
    crab@ubuntu:~/Example/Ctest$ size test.o
      text	   data	    bss	    dec	    hex	filename
        74	     12	      8	     94	     5e	test.o
    

    前三部分的内容是代码段、数据段和 bss 段及其相应的大小。然后是十进制格式和十六进制格式的总大小。最后是文件名。

    1. 通过objdump查看内部结构,-h显示各个段的基本信息
    crab@ubuntu:~/Example/Ctest$ objdump -h test.o
    
    test.o:     file format elf32-i386
    
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000035  00000000  00000000  00000034  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
      1 .data         0000000c  00000000  00000000  0000006c  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      2 .bss          00000008  00000000  00000000  00000078  2**2
                      ALLOC
      3 .rodata       00000015  00000000  00000000  00000078  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      4 .comment      0000002c  00000000  00000000  0000008d  2**0
                      CONTENTS, READONLY
      5 .note.GNU-stack 00000000  00000000  00000000  000000b9  2**0
                      CONTENTS, READONLY
    

    其中,Size表示段的长度,File off(File Offset)表示段所在的位置,
    每个段第二行表示段的属性,例如,CONTENTS表示该段在文件中存在

    1. 通过objdump查看所有段内容
      -s用于将所有段的内容以16进制的方式打印出来,
      -d用于将所有包含指令的段反汇编。
    crab@ubuntu:~/Example/Ctest$ objdump -s -d test.o
    
    test.o:     file format elf32-i386
    
    Contents of section .text:
     0000 5589e583 e4f083ec 20c74424 18040000  U....... .D$....
     0010 00c70424 0a000000 e8fcffff ffa30000  ...$............
     0020 0000c704 240b0000 00e8fcff ffffb800  ....$...........
     0030 000000c9 c3                          .....           
    Contents of section .data:
     0000 02000000 03000000 04000000           ............    
    Contents of section .rodata:
     0000 01000000 31323334 35360074 65737420  ....123456.test 
     0010 636f6465 00                          code.           
    Contents of section .comment:
     0000 00474343 3a202855 62756e74 752f4c69  .GCC: (Ubuntu/Li
     0010 6e61726f 20342e34 2e342d31 34756275  naro 4.4.4-14ubu
     0020 6e747535 2920342e 342e3500           ntu5) 4.4.5.    
    
    Disassembly of section .text:
    
    00000000 <main>:
       0:	55                   	push   %ebp
       1:	89 e5                	mov    %esp,%ebp
       3:	83 e4 f0             	and    $0xfffffff0,%esp
       6:	83 ec 20             	sub    $0x20,%esp
       9:	c7 44 24 18 04 00 00 	movl   $0x4,0x18(%esp)
      10:	00 
      11:	c7 04 24 0a 00 00 00 	movl   $0xa,(%esp)
      18:	e8 fc ff ff ff       	call   19 <main+0x19>
      1d:	a3 00 00 00 00       	mov    %eax,0x0
      22:	c7 04 24 0b 00 00 00 	movl   $0xb,(%esp)
      29:	e8 fc ff ff ff       	call   2a <main+0x2a>
      2e:	b8 00 00 00 00       	mov    $0x0,%eax
      33:	c9                   	leave  
      34:	c3                   	ret    
    
    

    最左边一列是偏移量,中间4列是16进制内容,最右边一列是段的ASCII码形式。

    • 代码段和反汇编结果
      这些事程序执行的机器指令,没有特殊需要说明的。
    • 数据段
    Contents of section .data:
    0000 02000000 03000000 04000000           ............    
    

    其中02000000(0x00000002), 03000000(0x00000003), 04000000(0x00000004)正是对应的代码中定义的全局变量g_B,全局静态变量g_C和局部静态变量local_B的值。

    • BSS段
      2 .bss          00000008  00000000  00000000  00000078  2**2
                     ALLOC
    

    虽然通过size查看BSS段大小是8字节,但是.bss段的数据为空,因此不占用目标文件的空间。从基本信息里可以看到BSS段和.rodata段的起始地址(00000078)是相同的。

    • rodata段
    Contents of section .rodata:
     0000 01000000 31323334 35360074 65737420  ....123456.test 
     0010 636f6465 00                          code. 
    

    从内容可以看到定义的const常量g_A和字符串常量“123456”都在这个段里面。
    在上面分的段中没有.rodata段,所以应该讲这段归入哪个段中哪?
    如果从基本信息中看分配的地址.rodata段地址是在.data段后面。为什么会说字符串常量是属于代码段哪?
    我这里对代码做了下修改将字符串常量从“123456”修改为“123456789123”,然后再编译通过size查看哪个段的大小发生了变化,这样就能确定字符串常量是否真的属于代码段。
    执行后结果

    crab@ubuntu:~/Example/Ctest$ size test.o
       text	   data	    bss	    dec	    hex	filename
         80	     12	      8	    100	     64	test.o
    
    

    发现代码段(text)大小发生了变化,变大了,这样就可以确认字符串常量是属于代码段,也就能确认.rodata是划分属于代码段的。
    为什么会这么划分,我查了些资料,const 和字符串字面值都在.rodata段。程序加载时.rodata和.text合并到一个segment中。所以,个人理解是.rodata段也认为是代码段的一部分。这也就涉及到文章开始时提到到静态代码和进程启动时的动态加载会合并一些段并再系统分配堆栈。

    展开全文
  • 文章来自:... 翻译自TI应用手册SPRAAU8 ...这个应用报告和相关的代码提供了一种把编译程序段从TMS320F28xxx的flash复制到ram的功能,这样可以提高代码的运行速度。这个解决方案在直接启动之

    文章来自:http://www.61ic.com/Article/C2000/Delfino/201303/47552.html

    翻译自TI应用手册SPRAAU8

     

    DSP28335—把TMS320F28XXX的程序段从flash复制到ram中运行很详细,对编写CMD文件很有帮助!

    摘要

    这个应用报告和相关的代码提供了一种把编译后的程序段从TMS320F28xxx的flash复制到ram的功能,这样可以提高代码的运行速度。这个解决方案在直接启动之后,进入c_int00 ——C语言代码运行之前实现此功能。


    本应用报告中讨论项目内容和代码可以以下网址下载:http://www-s.ti.com/sc/techlit/spraau8.zip


    1.引言:

    在许多应用中代码的执行速度是至关重要的。例如在医疗,监控,电机控制等等一些对时间有严格要求的终端设备。许多应用使用TMS320F28xxx DSCs是因为它的内置flash储存器。内置flash是TMS320F28xxx的一个优势,因为它使得设计者不需要外接flash来储存代码。使用内部flash缺点访问Flash需要等待状态,这使得程序的运行变慢。在大多数应用中,这不是一个问题。其他一些应用中可能会为了获得最高的运行速度要求无等待状态。内部RAM存储器具有零等待状态它是易失性存储器。所以,引导的初始化代码段不可以存储在此存储器

    现在提供的解决方案,使得设计者能够在运行时把被编译器初始化的代码段从flash复制到ram里,获得最大的运行速度。这使代码执行从多达15个等待状态的提升到0等待状态另一种解决方案只将某些函数从Flash复制RAM。详见:《Running an Application from Internal Flash Memory on the TMS320F28xx DSP》
    (SPRA958)。这种方法应该使用在大多数使用C2000™ DSC的应用上,其他要求严格时序和连续的零等待状态应用程序应采用这里提出的解决方案。

    编写汇编程序来完成代码从FlashRAM的复制汇编代码在复位向量后调用c_int00之前执行。这保证了在c_int00调用mian()之前完成复制

    有一些工程比较小,可以把所有初始化了的段都复制到ram。然而,其他一些工程的初始化了的段比所有的内部ram还要大。这些工程可能不可以把所有的初始化了的段都复制到ram,但是用这种方法复制其中一部分段。


    2.编译的代码段:

    编译器生成的包含代码和数据的多个部分,称为段。这下段分为两个不同的组:初始化了的和没被初始化的,初始化部分是由所有的代码,常量和初始化表组成的。下表列出了编译产生初始化段


    初始化段
    段名内容
    限制
    .cinit初始化的全局变量和静态变量代码
    .const显式初始化全局和静态const变量和字符串常量不超过64K长度
    .econst长调用的常量数据中的任何地方
    .pinit全局对象的构造函数
    代码
    .switchswitch语句产生的代码或者数据
    .text可执行代码和常数代码


    没初始化的段是由未初始化的变量,堆栈和malloc产生的内存下表列出了编译产生的没初始化段


    没初始化段
    段名内容限制
    .bss全局和静态变量不超过64K长度
    .ebss长调用的全局或静态变量数据中的任何地方
    .stack堆栈空间不超过64K长度
    .sysmemmalloc函数产生的内存不超过64K长度
    .esysmemfar_malloc函数产生的内存数据中的任何地方



    一旦编译器生成的这些段连接器会从各个源文件中取出这些段,并结合它们来创建一个输出文件。连接器命令文件(.cmd)就是用来告诉连接器去哪里找这些段的。初始化段必须分配到易失性存储器flash/ ROM当电源被撤除时,程序不会消失。未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。


    关于更多编译段和连接的信息,请参见:《TMS320C28x Assembly Language
    Tools User’s Guide 》(SPRU513) 和《 the TMS320C28x Optimizing C/C++ Compiler User’s Guide》(SPRU514)。

    德州仪器(TI)提供了多个例子显示如何使用链接器命令文件分配编译段。其中一个就是《Running an Application from Internal Flash Memory on the TMS320F28xx DSP 》(SPRA958)。应用文档提供的例子,演示了使用基于RAM和Flash项目链接器命令文件。


    3.软件:

    本应用文档相关代码文件,包括修改后的版本CodeStartBranch.asm文件和非DSP/BIOS™项目用的文件DSP28xxx_SectionCopy_nonBIOS.asm,由the C/C++ Header Files and Peripheral Examples提供。每个TMS320F28xxx处理器都提供了现成的连接器命令文件。提供的示例项目演示了如何使用这些文件。本应用文档以TMS320F2808为例。

    该软件独立存放于F28xxx_Flash_to_Ram文件夹中。代码使用的来自the C/C++ Header Files and Peripheral Examples的几个文件经过了Code Composer Studio 3.3和F28xxx代码生成工具5.0.0B3版本的测试。


    3.描述:

    一般的程序流程是这样子的:code_start->wd_disable->copy_sections->c_int00->mian()

    。这个软件流程比标准的软件流程仅仅多了调用复制代码段函数。标准的软件流程:code_start->wd_disable->c_int00->mian()。


    程序开始和关闭看门狗:

    code_start 和wd_disable 的运行代码由DSP28xxx_CodeStartBranch.asm文件提供。上电后,code_start执行,因为它被分配给Flash的引导地址的0x3F7FF6。详见:《Running an Application from Internal Flash Memory on the TMS320F28xx DSP
    》(SPRA958)

    1. WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
    2. .ref copy_sections
    3. .global code_start
    4. ***********************************************************************
    5. * Function: codestart section
    6. *
    7. * Description: Branch to code starting point
    8. ***********************************************************************
    9. .sect "codestart"
    10. code_start:
    11. .if WD_DISABLE == 1
    12. LB wd_disable ;Branch to watchdog disable code
    13. .else
    14. LB copy_sections ;Branch to copy_sections
    15. .endif

    这个函数从the C/C++ Header Files and Peripheral Examples提供的CodeStartBranch.asm文件修改而来,只是第二个调用用copy_sections代替了_c_int00。这个调用仅仅在WD_DISABLE为0时执行。上面的代码,WD_DISABLE 被设置为1。这使得wd_disable运行。wd_disable的代码如下:

    1. ***********************************************************************
    2. * Function: wd_disable
    3. *
    4. * Description: Disables the watchdog timer
    5. ***********************************************************************
    6. .if WD_DISABLE == 1
    7. .sect "wddisable"
    8. wd_disable:
    9. SETC OBJMODE ;Set OBJMODE for 28x object code
    10. EALLOW ;Enable EALLOW protected register access
    11. MOVZ DP, #7029h>>6 ;Set data page for WDCR register
    12. MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
    13. EDIS ;Disable EALLOW protected register access
    14. LB copy_sections ;Branch to copy_sections
    15. .endif

    这要求看门狗在_sections和c_int00函数运行期间被除能,否则,看门狗可能会在进入main()之前超时。这个函数也是从the C/C++ Header Files and Peripheral Examples提供的CodeStartBranch.asm文件修改而来,只是用copy_sections代替了_c_int00。


    Copy_sections:

    DSP28xxx_SectionCopy_nonBIOS.asm文件提供了copy_sections的代码,第一次运行到这里,看门狗是关闭的,段已经准备好被复制,段大小被存放在累加器,装载地址放在XAR6中,执行地址放在XAR7中,这个功能例子如下:

    1. MOVL XAR5,#_text_size ; Store Section Size in XAR5
    2. MOVL ACC,@XAR5 ; Move Section Size to ACC
    3. MOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6
    4. MOVL XAR7,#_text_runstart ; Store Run Address in XAR7
    5. LCR copy ; Branch to Copy
    段的大小,装载开始标志,执行开始标志都由连接器产生,这是在内存分配 -链接器命令文件一节讨论

    在地址和段长度都被存放好之后,copy程序被调用来确定段是否被编译器产生,这由检测累加器是否为0来确定。

    1. copy:
    2. B return,EQ ; Return if ACC is Zero (No section to copy)
    3. RPT AL ; Copy Section From Load Address to
    4. || PWRITE *XAR7, *XAR6++ ; Run Address
    5. return:
    6. LRETR ; Return
    如果累加器为0,程序会返回到调用前的地址,如果累加器不为0,有段需要被复制。这用上面所示的PWRITE指令来实现,PWRITE复制XAR6指向的存储器的内容到XAR7指向的内容。在这里,就是复制装载代码的地址的内容到运行代码的地址。这样,一直到累加器为0,完成整个段的复制,当所有段都被复制完,程序就会跳到c_int00,如下:
    1. LB _c_int00 ; Branch to start of boot.asm in RTS library

    到这里,C语言环境被建立,main()是可进去的。

    完整的copy_sections程序请参见相关文件夹中的DSP28xxx_SectionCopy_nonBIOS.asm。


    内存分配 - 连接命令文件(.cmd)

    如第二节所述,连接命令文件(.cmd)是用来告诉连接器怎么分配编译器产生的段的。The C/C++ Header Files and Peripheral Examples提供了标准的连接命令文件(.cmd)

    相关代码文件提供了三个链接器命令文件用于配置内存分配。

    · F280xx_nonBIOS_flash.cmd
    · F281x_nonBIOS_flash.cmd
    · F2833x_nonBIOS_flash.cmd

    每个文件一般都用相同的方法编写,只是在存储器方面有很小的一些差异(特殊设备)。连接命令文件(.cmd)的Memory部分是根据设备的内存空间来连接编译好的段的。详情参见具体控制器的数据手册。

    下表展示TMS320F2808的存储器映射:



    TMS320F28xxx系列控制器内置RAM,可以被分配为一个单独的段,或者更多的段,因为它是连续存储器映射。如上图所示,F2808有映射到存储器空间的L0,L1和H0 SARAMs,允许生成一个大的内存块,这个块可以被CMD文件的MEMORY部分如下定义:

    1. RAM_H0L0L1 : origin = 0x008000, length = 0x004000

    其余的也可以定义在MEMORY部分,完整的内存分配,请参见相关文件中的CMD文件。

    链接器命令文件的第二部分是SECTIONS。这是实际编译器把段连接到的存储区。所有DSP28xxx_CodeStartBranch.asm 和 DSP28xxx_SectionCopy_nonBIOS.asm的段都被装载到flash中运行,这部分如下所示分配:

    1. codestart : > BEGIN_FLASH, PAGE = 0
    2. wddisable : > FLASH_AB, PAGE = 0
    3. copysections : > FLASH_AB, PAGE = 0

    其他被初始化的段被下载到flash,但是在ram中运行。这是通过load和run指令来实现下面展示一个例子:
    1. .text : LOAD = FLASH_AB, PAGE = 0
    2. RUN = RAM_H0L0L1,PAGE = 0
    3. LOAD_START(_text_loadstart),
    4. RUN_START(_text_runstart),
    5. SIZE(_text_size)

    为了获得与一个段相关联的特定地址,如上所示,使用了LOAD_START, RUN_START, 和SIZE指令。这些指令的地址和大小DSP28xxx_SectionCopy_nonBIOS.asm文件使用到,用以在复制过程中指向正确的地址。DSP28xxx_SectionCopy_nonBIOS.asm这些值创建为全局变量,如下图所示

    1. .global _cinit_loadstart, _cinit_runstart, _cinit_size
    2. .global _const_loadstart, _const_runstart, _const_size
    3. .global _econst_loadstart, _econst_runstart, _econst_size
    4. .global _pinit_loadstart, _pinit_runstart, _pinit_size
    5. .global _switch_loadstart, _switch_runstart, _switch_size
    6. .global _text_loadstart, _text_runstart, _text_size

    测试例子:

    提供的示例TMS320F2812,TMS320F2808TMS320F28335eZdsp开发上进行了测试。板子上LED的闪烁可以从视觉上证实程序是否正确运行。下面的程序是基于F2808eZdsp评估板设计测试的。同样的,这种方法可以用于其他eZdsp开发



    Code Composer Studio环境:

    1.使用USB线连接F2808eZdsp开发板PC,接上电源线给板子供电

    2.打开Code Composer Studio,设置F2808 eZdsp 仿真器。

    3.打开和编译Example_280xx_Flash_to_RAM_nonBIOS.pjt。

    4.下载.out文件到芯片的flash中。

    5.调试程序(debug)。

    6.运行程序(run)。


    eZdsp电路板上的LED闪烁,表示程序正在运行。


    应用:

    现有的Flash应用程序可以很容易地通过移植相关代码文件来实现此功能。基本的移植步骤如下:

    1.用DSP28xxx_CodeStartBranch.asm替换CodeStartBranch.asm。

    2.在工程中添加DSP28xxx_SectionCopy_nonBIOS.asm文件。

    3.用特殊生成的CMD文件代替现有的CMD文件。


    这个基本步骤不适用于一些特殊情况,比如用户自己定义的段,等


    应用例子:

    为了演示的应用程序集成过程,在C280xC2801x
    C / C ++头文件和外设示例的Example_2808_Flash.pjt中使用下列步骤移植。

    1.下载安装C280x, C2801x C/C++ Header Files and Peripheral Examples。

    2.如上所述连接板,打开项目文件。

    3.删除项目中的DSP280x_CodeStartBranch.asm文件,在项目中添加DSP28xxx_CodeStartBranch.asm文件。

    4.在项目中添加DSP28xxx_SectionCopy_nonBIOS.asm文件。

    5.删除项目中的cmd文件,在项目中添加F280xx_nonBIOS_flash.cmd文件。

    6.把DSP280x_usDelay.asm中的.sect “ramfuncs”改为.text,使DSP28x_usDelay在被分配在.text段中。

    7.删除DSP280x_SysCtrl.c文件中的#pragma CODE_SECTION(InitFlash, “ramfuncs”);。使得InitFlash( )函数被分配到.text而不是ramfuncs。

    8.删除Example_280xFlash.c文件中的#pragma CODE_SECTION(epwm1_timer_isr, “ramfuncs”);和#pragma CODE_SECTION(epwm2_timer_isr, “ramfuncs”);。使得中断服务函数被分配到.text而不是ramfuncs。

    9.删除Example_280xFlash.c文件中的MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart)注意:这个已经不需要
    InitFlash( )。由于代码已经被复制到RAM,这些是不需要的了。

    10.如上所述,编译连接程序,把程序下到芯片里运行。


    eZdsp电路板上的LED闪烁,表示程序正在运行。


    存储空间占用:

    因为仅仅在DSP28xxx_SectionCopy_nonBIOS.asm文件中增加了copy_sections的代码。增加的占用的片内flash为0x3C。code_start 和wd_disable函数没有增加额外的代码,他们本来就在C/C++ Header Files and Peripheral Examples的所用项目中被使用。



    测试:

    因为这个功能开机后直接实现,闪存等待状态,锁相环(PLL)都没有配置,因此,它们都运行默认值Flash等待状态15个周期对于F280xx/F281x设备SYSCLKOUTOSCCLK/2,对于F2833x设备SYSCLKOUTOSCCLK/ 4使Code Composer Studio分析功能可以测量运行时间。下表给出了每个F28xxx控制器启动到main()函数的第一个指令所用的时间,如下所示,由于个平台的代码长度和系统时钟不一样,他们的运行时间也不一样。



    限制:

    此实现的限制因素使用的TMS320F28xxx控制器内部RAM的大小。这限制了那些工程可以使用这种方法,如果工程太大,以至于没法放进RAM里,这种方法是不能用的。(除非外扩RAM)


    建议:

    有一些项目需要这种功能,但不是所有被初始化段都要复制到RAM或者没有足够的RAM放下所有的段。仅仅需要复制应用代码本身。这种情况下,仅仅需要复制.text段到RAM这样子,可以把DSP28xxx_SectionCopy_nonBIOS.asm文件和cmd文件中复制其他段的代码删掉,把其他段放在flash中运行。减少flash的占用空间和缩短了运行到main()的时间。

    应该确定应用程序可以处理复制代码执行时间一点滞后。如果应用程序不能处理这段时间,可以使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。

    如果使用DSP的引导,建议使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。一个使用DSP / BIOS的项目,通常是一个较大的项目,不建议使用此方案。


    结语:

    这份应用文档展示,在建立C语言环境之前,通过把flash的代码复制到ram,可以使TMS320F28xxx的控制器实现等待状态运行。这方案给出了代码和存储空间的限制,为设计者提供了实现了这种功能的相关文件。

    展开全文
  • python将一段程序无效掉的方法

    千次阅读 2020-11-21 04:03:18
    2020-09-03 14:27:12来源:亿速云阅读:89作者:小新小编给大家分享一下python将一段程序无效掉的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章大有收获,下面让...

    python将一段程序无效掉的方法

    发布时间:2020-09-03 14:27:12

    来源:亿速云

    阅读:89

    作者:小新

    小编给大家分享一下python将一段程序无效掉的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    1、python中可以用注释屏蔽一段语句,具体方法如下,首先打开一段python的示例程序:

    148000.png

    2、然后单行注释的方法是在语句前面加上#,程序运行后添加注释的地方的语句会被自动跳过,这里可以看到将打印变量a的语句添加注释就没有打印出结果:

    148001.png

    3、最后如果有一列连续的语句需要注释,可以不用“#”号一行一行的注释,python中提供了多行注释的方法,可以用三个英文引号的方式注释,可以是单引号也可以是双引号,这里将下面b变量的语句注释后就打印不出结果了:

    148002.png

    4、选中要注释的段落,按下ctrl+/,效果如下:

    148003.png

    再按一下ctrl+/,即可取消注释。

    以上是python将一段程序无效掉的方法的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    展开全文
  • 下面程序运行结果是: main() { int x,i,j; for(i=1;i<=100;i++) { x=i; if(++x%20) if(++x%30) if(++x%7==0) printf("%d ",x); } } A)39 81 B)42 84 C)26 68 D) 28 70 nt x,i; //定义两个整型变量dao for(i=1;i...

    下面程序的运行结果是:
    main()
    { int x,i,j;
    for(i=1;i<=100;i++)
    { x=i;
    if(++x%20)
    if(++x%3
    0)
    if(++x%7==0)
    printf("%d ",x);
    } }
    A)39 81 B)42 84 C)26 68 D) 28 70

    nt x,i; //定义两个整型变量dao
    for(i=1;i<=100;i++) //i从1到du101循环
    {
    x=i; //将zhii当前循环的值dao赋值给x,循环体内,内i是不变的容,记着 IN
    if(++x%20) //将x加1后是否能被2整除,注意x先加1了,此时x=IN+1
    if(++x%3
    0) //将x加1后是否能被3整除,注意x先加1了,此时x=IN+2
    if(++x%7==0) //将x加1后是否能被7整除,注意x先加1了,此时x=IN+3
    printf("%d",x); // 如果条件均满足,打印出x的值,也就是IN+3的值
    }
    考点:
    1、整个循环结束时i等于101
    2、++x是先加再判断,可以 修改为
    printf(“x=%d,i=%d\n”,x,i);
    就知道了
    3、源程序只需要读懂,能模拟运行就更好了,没啥解题思路的。
    运行结果是2870,其实是28和70,但是中间没有分开输出,所以连一起了。

    展开全文
  • 从0开始搭建微信小程序(前后端)的全过程

    万次阅读 多人点赞 2019-04-14 22:21:40
    时间比较闲就尝试着做了一个微信小程序,一是为了锻炼自己独立部署一个前后端全链路系统的能力,二是想做一个自己都想用的小程序出来。方向是让用户可以集中获取优质的电影、音乐、书籍、游戏等信息的推荐,那...
  • 例如执行 update demo set age=age+1 ,正常情况下会返回一个int 数,也就是受影响的行数,现在我不仅需要它返回受影响的行数,还需要返回更新的age的值。 我:这简单啊,执行完update以后,再select一下不...
  • 在阅读完《深入理解计算机系统》第一章(计算机系统漫游)、第七章(链接)以及第十章(虚拟存储器)和《程序员的自我修养——链接、装载与库》,历时悠久的梦想终于要实现了。开篇之初,首先提出一个迷惑了很久的...
  • 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符:父进程显示“A”; 子进程分别显示字符“b”和“c”。试观察记录...
  • 从编写源代码到程序在内存中运行的全过程解析

    万次阅读 多人点赞 2018-04-21 17:49:51
    作为一个C/C++程序员,搞清楚从编写源代码到程序运行过程中发生的细节是很有必要的。这在之前也是困扰我的一个很大问题,因为最近在忙着找实习,一直没有下定决心来写这篇博客,最近才抽时间写。下面的代码除了明显...
  • 程序运行时的内存空间分布

    万次阅读 多人点赞 2014-03-21 01:33:18
    其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,以虚拟地址来看,数据或代码是一块...
  •  这个应用报告和相关的代码提供了一种把编译程序段从TMS320F28xxx的flash复制到ram的功能,这样可以提高代码的运行速度。这个解决方案在直接启动之后,进入c_int00 ——C语言代码运行之前实现此功能。  本...
  • SQL语句执行结果集的获取

    万次阅读 2018-01-28 17:16:23
    数据源在执行完SQL语句会返回一个结果集对象,将SQL执行结果返回到结果集对象中,应用程序执行完SQL语句,解析结果集对象中的结果,得到具体的结果,这次的主要内容是如何解析结果集对象并获取其中的值。...
  • KEIL5程序运行问题解决方案

    千次阅读 2019-03-20 17:24:20
    对于新手来说,在我们辛辛苦苦把keil5安装好以后,运行别人写好的或者自己便携的还是修改的程序,发现不行,运行不了。总是报错,可我们仔细检查发现和源程序(你copy的那个程序)是一样的啊,这是正常的,不是你们...
  • 深入理解程序从编译到运行

    万次阅读 多人点赞 2017-10-17 10:47:18
    From:... 从Hello World说程序运行机制:http://www.sohu.com/a/132798003_505868 C/C++中如何在main()函数之前执行一条语句?:https://www.zhihu.com/question/26031933 (深入理解计算机系统...
  • Linux定时启动运行程序的方法

    千次阅读 2017-09-14 11:25:07
    cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对...如果当某任务被调度时系统不在运行,该任务就不会被执行。 要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行cron服务。...
  • 3分钟读懂java程序执行原理

    千次阅读 2018-12-17 17:01:21
    学校里的老师都会教java是一种高级语言,会由编译器编译执行。脱离了学校,回过头来想想,当时老师说的可真是简单,实际上理解起来还是需要下一番功夫的。 1. 编译还是解释? 老师都告诉我们了,java要编译才能...
  • 1.执行以下程序段后,输出结果和a的值是() int a=10; printf("%d",a++); A、11 和10 B、11 和11 C、10 和11 D、10 和10 答案: C 2.已知字符'A'的ASCⅡ代码值是65,字符变量c1的值是'A',c2的值是'D'....
  • exec() 家族的函数将会创建一个新的进程来执行程序。(不能设置权限,只是单纯的传值执行exe) _execl, _wexecl _execv, _wexecv _execle, _wexecle _execve, _wexecve _execlp, _wexeclp _execvp, _wexecvp _...
  • 2. 程序编译的四个阶段

    万次阅读 多人点赞 2018-07-28 22:53:14
    为了我们编写的hello.c程序可以被执行,驱动硬件电路工作,hello.c程序必须经过一些处理步骤,将源程序转化为可执行性的目标程序。而我们知道,机器语言就是处理器可以直接理解(与生俱来就能理解)的编程语言,...
  • 《使用Java理解程序逻辑》阶段测试1-笔试题 一、填空题 30分 1. JAVA源程序的文件名要求和类名要( 文件名=类名.java)。 2. Java程序严格区分( 大小写 )。 3. ( main)方法是JAVA程序的入口。 4. 变量的3要素...
  • 1,有这么一个问题,下面这段程序执行完毕,malloc的内存会释放吗? int main () { int *p = malloc(10 * sizeof *p); *p = 42; return 0; //Exiting without freeing the allocated memory } 这段程序...
  • 程序一定要从main函数开始运行吗?

    千次阅读 2020-06-06 21:16:10
    程序一定要从main函数开始运行吗?本文涉及静态链接相关知识。 对于静态链接先提出两个问题: Q:每个目标文件都有好多个,目标文件在被链接成可执行文件时,输入目标文件中的各个如何被合并到输出文件? A:...
  • 下列 Python语句的输出结果

    千次阅读 2021-02-11 17:44:18
    【填空题】遍历输出文件所有行。 f=open("d:\\r2.txt","r") while True: str= print(str,end='') if not str... print(str.upper(s1))”的运行结果是?【单选题】下列语句中, ( ) 在 Python 中是非法的。【单选题】执...
  • 在操作数据库时会经常遇到把一值赋值给另外一:具体的sql如下: UPDATE admins_exam_papers SET created_at=updated_at WHERE id>10;
  • 如何在Visual C++下调试运行C程序

    千次阅读 2017-04-04 22:20:13
    本文转载自互联网,如有侵权,请联系我及时删除。谢谢。   从2008年4月开始,全国计算机等级考试将...众所周知,VC软件主要是用来开发C++程序的,如何在VC下调试运行C程序,对于众多程序设计者来说,确实是一个新的话
  • 通过Xshell工具连接远程阿里云服务器,如何运行python程序呢?这个大家都知道,python命令啦。 举个栗子:通过Xshell在某个目录下输入命令:python test.py就执行了test.py这个程序。 但是如果我这个test.py要...
  • //無操作5分钟進入屏保 } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); ...
  •  这个应用报告和相关的代码提供了一种把编译程序段从TMS320F28xxx的flash复制到ram的功能,这样可以提高代码的运行速度。这个解决方案在直接启动之后,进入c_int00 ——C语言代码运行之前实现此功能。  ...
  • 错误,在C语言中注释部分对程序运行结果不产生任何影响,它可以出现在程序的任何位置。在C语言中有两种注释方式:一种是以“/*”开始、以“*/”结束的块注释;一种是以“//”开始、以换行符结束的单行注释。相关...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510,083
精华内容 204,033
关键字:

列程序段执行后的结果