zoukankan      html  css  js  c++  java
  • va_arg实现

    前几天测试的时候,遇到了个问题,顺便看了下printf的实现。

    讲下废话,测试是为了什么呢?几个月前测试6500指令集的我改了下代码,
    目的是为了能让测试通过,好在周末休息下,可是测试就是为了让程序在硬件上
    跑通吗?测试,本身就是为了发现问题,而我在进行指令集的时候却试图改变代码,
    以试图在芯片未流片前就用软件修正自身的问题,可是我们在这个阶段是完全可以
    可以更该一些错误的啊。测试的时候,发现问题很好啊,不然还要测试干嘛……
    废话讲多了,进入正题:printf实现部分的va_start, va_arg, va_end。

    C参数中在栈中的存储方式为从右到左,栈的生长方向为从高到低,无论是大端还是小端,
    低地址都是作为变量的地址。

          1 typedef char * va_list;
          2
          3 #define __INTSIZEOF(n) \
          4     ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
          5
          6 #define __ADDRESS(v) (&(v))
          7
          8 #define va_start(ap, v) \
          9     (ap = (va_list) __ADDRESS(v) + __INTSIZEOF(v))
         10
         11 #define va_arg(ap, t) \
         12     (*(t*)((ap += __INTSIZEOF(t)) - __INTSIZEOF(t)))
         13
         14 #define va_end(ap) \
         15     (ap = (va_list) 0)  

  • 相关阅读:
    [ASM/C/C++]内存碎片处理技术
    NASM网际编译器手册(三)
    NASM网际编译器手册(四)
    NASM网际编译器手册(六)
    NASM网际编译器手册(一)
    IEEE浮点数表示法
    设计模式学习每日一记(12.轻量模式)
    设计模式学习每日一记(11.代理模式)
    canvas一句话备忘录
    usaco1.1.1PROB Your Ride Is Here
  • 原文地址:https://www.cnblogs.com/openix/p/2831113.html
Copyright © 2011-2022 走看看