计算机组成原理(计算机系统3)--实验一:WinMIPS64模拟器实验
一、实验目标:
了解WinMIPS64的基本功能和作用;
熟悉MIPS指令、初步建立指令流水执行的感性认识;
掌握该工具的基本命令和操作,为流水线实验做准备。
二、实验内容
按照下面的实验步骤及说明,完成相关操作记录实验过程的截图:
1)下载WinMIPS64;运行样例代码并观察软件各个观察窗口的内容和作用,掌握软件的使用方法。
2)学会正确使用WinMIPS64的IO方法。
3)编写完整的排序程序。
三、实验环境
硬件:桌面PC
软件:Windows,WinMIPS64仿真器
四、WinMIPS64软件使用
1)安装
解压给出的winmips64.zip压缩文件到给定的工作目录中(如在我的电脑中的路径是E:\winmips64)。
2)开始和配置WinMIPS64
双击winmips64.exe文件后,打开了WinMIPS64模拟器。
在主窗口中,我们可以看见七个子窗口,和一条在底部的状态栏。这七个子窗口分别是Pipeline, Code, Data,Registers, Statistics, Cycles和Terminal。这七个窗口的作用如下:
- Pipeline窗口: 展示MIPS64处理器的五级流水线结构及浮点操作单元,指示当前指令在不同流水段的状态。
- Code窗口: 显示存储器内容,包括地址、机器代码和汇编指令。通过颜色标识指令处于“取指”、“译码”等不同阶段。
- Cycles窗口: 显示流水线的时空图,指令执行过程的可视化,帮助识别指令间的依赖关系和数据停滞情况。
- Data窗口: 观察内存中的数据,包括地址和内容。可通过双击或右键修改整型或浮点型数据。
- Registers窗口: 显示寄存器中的值,指示当前写入和前递状态。允许用户交互式修改寄存器值。
- Statistics窗口: 记录模拟周期的统计数据,包括指令数、执行周期数、暂停周期数等,提供性能分析信息。
- Terminal窗口: 显示运行过程中输出的信息和状态,如数据相关的错误提示等,帮助用户调试和理解模拟过程。
3)装载测试程序
用标准的text编辑器来新建一个名为sum.s的文件,这个文件的功能是,计算两个整数A、B之和,然后将结果传给C。
首先使用asm.exe程序检测一下sum.s是否合法,检测方法为用命令行输入asm.exe 目标检测文件(.\asm.exe .\sum.s),可以发现下图使用asm.exe检测之后,没有错误(0 errors),即sum.s编译非常顺利。
下面我们将sum.s装载到winmips.exe程序中。打开winmips程序之后,使用快捷键“ctrl + o”打开文件进行装载,点击对应的文件即可。将sum.s加载到 winmips64程序中,得到初始化页面。
不断地按下F7(逐步进行),让程序运行,得到下图,可以发现一些窗口发生了变化。在运行的过程中,左上角Cycle,PipeLine和Code窗口出现了一些彩色标注的方块区域,Registers和Data窗口没有发生什么变化,statistics窗口有一些行列数据发生了变化。
通过查阅手册和相关资料,我们了解到,Cycles、Pipeline和Code窗口主要展示程序运行过程中指令的执行过程。这些窗口标识了每条指令所处的阶段,包括“取指”、“解码”、“执行”、“访存”和“写回”,与课程内容紧密对应。
Registers和Data窗口则提供了程序运行过程中寄存器和内存的数据状态。最后,Statistics窗口记录了程序运行过程中的各项统计信息。此外,还有一个终端窗口,用于与程序进行交互,尽管在这个程序中没有使用到。
在对这些窗口有了初步了解后,我们可以逐步跟踪程序运行,观察不同时间点的状态。计算机能够像流水线一样同时处理多条指令,以“取指”、“解码”、“执行”、“访存”和“写回”并行执行,从而提高运行效率。下图展示了程序运行结束后的状态。可以看到,在某些时刻,Cycles窗口中,计算机仍在进行取指和解码操作,这导致红色方块的执行模块处于空载阶段。从Cycles窗口在程序结束后的状态图中,可以发现当ID和IF模块执行完成之后,EX模块也开始继续往下执行了。
五、作业一:终端IO简单实例
1)程序设计
使用winmips64的终端来实现程序的输入输出,以”hello world”程序为例。首先,需要知道I/O区域的内存映射,一个是控制字,一个是数据字,具体结构如下:
控制字(CONTROL):
地址:通常在一个特定的内存地址,例如 0x10000。
功能:用于指示当前I/O操作的状态或类型。不同的值代表不同的操作,比如读取、写入或设置状态。
数据字(DATA):
地址:通常在另一个特定的内存地址,例如 0x10008。
功能:存储要发送到终端的数据或接收从终端输入的数据。
通过这两个区域,程序可以通过设置控制字和相应的数据字实现与终端的交互。具体的映射和使用方式可能因系统和具体实现而有所不同。
程序的运行逻辑如下:
(1)定义数据区:只需定义字符串、存储数据和控制变量的地址。
(2)代码区处理:
将字符串地址(如0x10008)加载到寄存器中。
将字符串内容存储到指定的内存地址。
将变量值4存储到地址0x10000,以指示程序打印字符串。
当完成以上这些步骤后,程序会将0x10008中的数据打印到终端,输出“hello world”。
(3)代码实现
.data string: .asciiz "hello, world!" # define string CONTROL: .word32 0x10000 # define control address DATA: .word32 0x10008 # define data address .text main: lwu r30, DATA(r0) # load 0x10008 to r30 daddi r31, r0, string # load string address to r31 sd r31, (r30) # store string address at 0x10008 lwu r30, CONTROL(r0) # load 0x10000 to r30 daddi r31, r0, 4 # load 4 to r31 sd r31, (r30) # store 4 at 0x10000,print string halt # stop program |
上面代码主要用了lwu,daddi,sd这三个指令:
(1)lwu:从内存中加载一个32位的无符号字(word)到寄存器中。
用法:lwu 寄存器, 偏移(基址寄存器)。如lwu r30, DATA(r0)表示从地址DATA(0x10008)加载一个无符号字到寄存器r30。
(2)daddi:将一个立即数与指定寄存器中的值相加,结果存储在目标寄存器中。这个指令用于处理64位数据。
用法:daddi 目标寄存器, 源寄存器, 立即数。如daddi r31, r0, string表示将string的地址加到寄存器r0(即0),结果存储在r31中。
(3)sd:将一个64位的双字(doubleword)从寄存器存储到内存的指定地址。
用法:sd 源寄存器, (目标地址寄存器)。如sd r31, (r30)表示将寄存器r31中的值存储到寄存器r30所指向的内存地址中。
2)检查合法性
用asm.exe检验一下程序的正确性,在终端中输入\asm.exe .\helloworld.s,得到如下的结果,没有错误(0 errors),即helloworld.s编译非常顺利。
3)结果运行
将helloworld.s加载到winmips64中,不断地按下F7之后进行单步运行,得到下图的结果。得到cycles顺利地进行了流水执行指令,没有raw stalls的情况发生,然后看终端,可以得到打印出了“hello,world!”。
六、作业二:编写排序算法
1)程序设计
实现对一个整数数组的冒泡排序(从小到大),并在终端中输出排序前后的数组数据。程序逻辑如下:
数据区定义:定义了输出字符串(排序前和排序后)、控制地址、数据地址、栈指针、标志变量和待排序的数组。
初始数组数据自定义为:9,0,7,2,4,3,1,6,8,5
(1)主程序:
首先加载栈指针(SP)和控制、数据地址(CONTROL和DATA)。
打印排序前的数组:设置输出格式为字符串,加载"Before sort"字符串并存储地址,然后触发打印。设置输出格式为整数,循环遍历数组,逐个将元素存储到数据地址,触发打印。
(2)冒泡排序:调用bubblesort函数对数组进行排序。
bubblesort内部:
分配栈空间并保存返回地址和一些寄存器的值。
使用两层循环进行冒泡排序:外层循环控制排序的轮数(i),内层循环控制相邻元素的比较(j)。在内层循环中,比较相邻的元素,如果前一个元素大于后一个元素,则调用swap函数进行交换。
结束时恢复寄存器和栈指针。
打印排序后的数组:同样设置输出格式为字符串,加载"After sort"字符串并存储地址,触发打印。设置输出格式为整数,循环遍历排序后的数组,逐个将元素存储到数据地址,触发打印。
结束程序:使用halt指令停止程序执行。
需要注意的是:
不能将栈指针初始化为0。因为如果将SP设置为0,进行SP - 1操作时,会指向FFFFFFFF,这超出了MIPS模拟器(winmips)的内存范围,可能导致程序崩溃或出现错误。
打印字符串和打印数字时,传递给地址0x10000的值不同,字符串使用4,而数字使用2。这一点需要特别注意,以确保程序能正确显示输出。
2)代码实现
除了lwu,daddi,sd三条指令,还使用如下指令:
- dsll :将寄存器中的值左移指定的位数,结果存入目标寄存器。左移时低位补零,适用于乘以2的幂。
- bne :如果两个寄存器的值不相等,则跳转到指定标签。常用于条件判断。
- jal :跳转到指定标签并保存返回地址到$ra寄存器。常用于调用函数。
- slt :比较两个寄存器的值,如果第一个寄存器小于第二个,则将目标寄存器设置为1,否则为0。用于条件判断。
- beq :如果两个寄存器的值相等,则跳转到指定标签。与bne相反。
- j :无条件跳转到指定标签。用于程序流程控制。
- jr :根据寄存器中的地址进行跳转,通常用于返回函数。
具体实现代码如下:
.data after: .asciiz "After sort the array is:\n" # Output after sorting before: .asciiz "Before sort the array is:\n" # Output before sorting CONTROL: .word 0x10000 # Control address DATA: .word 0x10008 # Data address SP: .word 0x300 # Stack pointer flag: .word 0 # Flag variable array: .word 9,0,7,2,4,3,1,6,8,5 # Array to sort .text main: ld r29, SP(r0) # Load stack pointer ld r16, CONTROL(r0) # Load control address ld r17, DATA(r0) # Load data address # Print before sorting daddi r8, r0, 4 # Set string output format daddi r9, r0, before # Load "Before sort" string sd r9, (r17) # Store address for printing sd r8, (r16) # Trigger print # Print array before sorting daddi r8, r0, 2 # Set integer output format daddi r2, r0, 10 # Array length daddi r1, r0, 0 # Index i print1: dsll r3, r1, 3 # Calculate array address ld r9, array(r3) # Load array[i] sd r9, (r17) # Store for printing sd r8, (r16) # Trigger print daddi r1, r1, 1 # Increment i (i++) bne r2, r1, print1 # Loop if i < 10 # Sort the array daddi r4, r0, array # Load array address daddi r5, r0, 10 # Load length jal bubblesort # Call bubble sort # Print after sorting daddi r8, r0, 4 # Set string output format daddi r9, r0, after # Load "After sort" string sd r9, (r17) # Store address for printing sd r8, (r16) # Trigger print # Print array after sorting daddi r8, r0, 2 # Set integer output format daddi r2, r0, 10 # Array length daddi r1, r0, 0 # Index i print2: dsll r3, r1, 3 # Calculate array address ld r9, array(r3) # Load array[i] sd r9, (r17) # Store for printing sd r8, (r16) # Trigger print daddi r1, r1, 1 # Increment i bne r2, r1, print2 # Loop if i < 10 halt # End program bubblesort: daddi r29, r29, -24 # Allocate stack space sd $ra, 16(r29) # Save return address sd r16, 8(r29) # Save r16 sd r17, 0(r29) # Save r17 dadd r22, r4, r0 # Load array address daddi r23, r5, 0 # Load length # Outer loop: for (int i = 0; i < n; i++) and r18, r18, r0 # i = 0 loop1: slt r10, r18, r23 # Check i < n beq r10, r0, exiti # Exit if i >= n # Inner loop: for (int j = i - 1; j >= 0; j--) daddi r19, r18, -1 # j = i - 1 loop2: slti r10, r19, 0 # Check j < 0 bne r10, r0, exitj # Exit if j < 0 # Compare and swap dsll r11, r19, 3 # Calculate a[j] dadd r12, r11, r22 # r12 = address of a[j] ld r13, 0(r12) # Load a[j] ld r14, 8(r12) # Load a[j + 1] slt r10, r14, r13 # Check if a[j + 1] > a[j] beq r10, r0, exitj # Skip swap if not dadd r4, r0, r12 # Address of a[j] daddi r5, r12, 8 # Address of a[j + 1] jal swap # Call swap # Decrement j and repeat inner loop daddi r19, r19, -1 j loop2 exitj: # Increment i and repeat outer loop daddi r18, r18, 1 j loop1 exiti: # Restore stack and return ld r17, 0(r29) # Restore r17 ld r16, 8(r29) # Restore r16 ld $ra, 16(r29) # Restore return address daddi r29, r29, 24 # Restore stack pointer jr $ra # Return to caller swap: # Swap two array elements ld r9, 0(r4) # Load a[i] ld r10, 0(r5) # Load a[j] sd r10, 0(r4) # a[i] = a[j] sd r9, 0(r5) # a[j] = a[i] jr $ra # Return to caller |
3)检查合法性
用asm.exe检验一下程序的正确性,在终端中输入\asm.exe .\sort.s,得到如下的结果,没有错误(0 errors),即sort.s编译非常顺利。
4)结果运行
将sort.s加载到winmips64中,不断地按下F7之后进行单步运行,得到下图的结果。得到cycles顺利地进行了流水执行指令,没有raw stalls的情况发生,然后看终端,可以得到先打印了初始未排序的数组数据9,0,7,2,4,3,1,6,8,5,而后打印了排序后的数组数据0,1,2,3,4,5,6,7,8,9。
相关文章:
计算机组成原理(计算机系统3)--实验一:WinMIPS64模拟器实验
一、实验目标: 了解WinMIPS64的基本功能和作用; 熟悉MIPS指令、初步建立指令流水执行的感性认识; 掌握该工具的基本命令和操作,为流水线实验做准备。 二、实验内容 按照下面的实验步骤及说明,完成相关操作记录实验…...
读书笔记~管理修炼-风险性决策:学会缩小风险阈值
假设你的团队为了提升业绩,提出了两个解决方案:A方案是通过营销提升老产品的利润;B方案是通过研发开拓新产品,你会怎么选? 我们先来分析下,其实无论是A方案还是B方案,都会遇到市场难题…...
VIVADO FIFO (同步和异步) IP 核详细使用配置步骤
VIVADO FIFO (同步和异步) IP 核详细使用配置步骤 目录 前言 一、同步FIFO的使用 1、配置 2、仿真 二、异步FIFO的使用 1、配置 2、仿真 前言 在系统设计中,利用FIFO(first in first out)进行数据处理是再普遍不过的应用了,…...
tcp粘包原理和解决
tcp粘包原理和解决 咱们先通过展示基于tcp 的cs端消息通信时的现象,带着问题再解释下面的tcp粘包问题。 一、原始代码 tcp 服务端代码 // socket_stick/server/main.gofunc process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)var bu…...
C语言预处理艺术:编译前的魔法之旅
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...
C++算法第十六天
本篇文章我们继续学习动态规划 第一题 题目链接 978. 最长湍流子数组 - 力扣(LeetCode) 题目解析 从上图可见其实有三个状态 代码原理 注意:我们在分析题目的时候分析出来的是三个状态,分别是上升、下降、平坦,但是…...
计算机网络 (45)动态主机配置协议DHCP
前言 计算机网络中的动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)是一种网络管理协议,主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义:DHCP是一种网络协议…...
归子莫的科技周刊#2:白天搬砖,夜里读诗
归子莫的科技周刊#2:白天搬砖,夜里读诗 本周刊开源,欢迎投稿。 刊期:2025.1.5 - 2025.1.11。原文地址。 封面图 下班在深圳看到的夕阳,能遇到是一种偶然的机会,能拍下更是一种幸运。 白天搬砖,…...
平滑算法 效果比较
目录 高斯平滑 效果对比 移动平均效果比较: 高斯平滑 效果对比 右边两个参数是1.5 2 代码: smooth_demo.py import numpy as np import cv2 from scipy.ndimage import gaussian_filter1ddef gaussian_smooth_array(arr, sigma):smoothed_arr = gaussian_filter1d(arr, s…...
Elasticsearch容器启动报错:AccessDeniedException[/usr/share/elasticsearch/data/nodes];
AccessDeniedException 表明 Elasticsearch 容器无法访问或写入数据目录 /usr/share/elasticsearch/data/nodes。这是一个权限问题。 问题原因: 1、宿主机目录权限不足:映射到容器的数据目录 /data/es/data 在宿主机上可能没有足够的权限供容器访问。 …...
【Linux系统编程】——深入理解 GCC/G++ 编译过程及常用选项详解
文章目录 1. GCC/G 编译过程预处理(Preprocessing)编译(Compilation)汇编(Assembly)连接(Linking) 静态链接与动态链接静态链接动态链接静态库和动态库 GCC 常用选项关于编译器的周边…...
Mac安装配置使用nginx的一系列问题
brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx,如下命令所示: brew install nginx 如下图所示: 2.查看nginx的配置信息,如下命令: brew info nginxFrom:xxx 这样的,是n…...
Vue3中使用组合式API通过路由传值详解
在Vue 3中,使用组合式API来传递路由参数是一种常见的需求。Vue Router 是 Vue.js 的官方路由管理工具,可以在不同的场景下通过多种方式传递和接收路由参数。下面将详细讲解几种常见的路由传值方式,并提供相应的代码示例。 1. 通过路由参数传…...
两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库
目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的,所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意:直接git pu…...
浏览器安全(同源策略及浏览器沙箱)
一、同源策略(Same Origin Policy) 1.定义 同源策略(Same - origin Policy)是一种浏览器的安全机制。它规定一个网页的脚本只能访问和操作与它同源的资源。这里的 “源” 包括协议(如 http、https)、域名&…...
w~Transformer~合集11
我自己的原文哦~ https://blog.51cto.com/whaosoft/12472192 #LightSeq 最高加速9倍!字节跳动开源8比特混合精度Transformer引擎,近年来,Transformer 已经成为了 NLP 和 CV 等领域的主流模型,但庞大的模型参数限制了它的高效训练和推理。…...
Coursera四门课备考入学考试
某学校入学考试复习用,刷到的话纯靠缘分,不方便回答多余问题 (博主本人waive掉了没有考过,但还是基本都学完了) 记录学习coursera的四门课(顺序Py在DS前,其他无所谓) Mathematics fo…...
Flink(八):DataStream API (五) Join
1. Window Join Window join 作用在两个流中有相同 key 且处于相同窗口的元素上。这些窗口可以通过 window assigner 定义,并且两个流中的元素都会被用于计算窗口的结果。两个流中的元素在组合之后,会被传递给用户定义的 JoinFunction 或 FlatJoinFunct…...
HarmonyOS NEXT边学边玩:从零实现一个影视App(六、视频播放页的实现)
在HarmonyOS NEXT中,ArkUI是一个非常强大的UI框架,能够帮助开发者快速构建出美观且功能丰富的用户界面。本文将详细介绍如何使用ArkUI实现一个影视App的视频播放页面。将从零开始,逐步构建一个功能完善的视频播放页面,并解释每一部…...
salesforce实现一个字段的默认初始值根据另一个字段的值来自动确定
在 Salesforce 中,可以通过 公式字段 或 触发器 (Trigger) 实现字段的默认初始值根据另一个字段的值来自动确定,具体实现方法如下: 1. 使用公式字段 公式字段是一种动态字段,值会根据公式实时计算。 步骤: 导航到字段…...
Linux 文件权限详解
目录 前言 查看文件权限 修改文件权限 符号方式 数字方式 前言 Linux 文件权限是系统中非常重要的概念之一,用于控制对文件和目录的访问。权限分为读(Read)、写(Write)、执行(Execute)三个…...
【混合开发】CefSharp+Vue桌面应用程序开发
为什么选择CefSharpVue做桌面应用程序 CefSharp 基于 Chromium Embedded Framework (CEF) ,它可以将 Chromium 浏览器的功能嵌入到 .NET 应用程序中。通过 CefSharp,开发者可以在桌面应用程序中集成 Web 技术,包括 HTML、JavaScript、CSS 等…...
springBoot项目使用Elasticsearch教程
目录 一、引言(一)使用背景(二)版本库区别 二、引入依赖(一)springboot集成的es依赖(建议)(二)es提供的客户端库 三、配置(以yaml文件为例&#x…...
模型 多元化思维(系统科学)
系列文章分享模型,了解更多👉 模型_思维模型目录。融合多学科知识,全面解决问题。 1 多元化思维模型的应用 1.1 完美日记的私域流量运营 完美日记作为美妆行业的新兴品牌,通过多元化的思维模型在私域流量运营中取得了显著成功。…...
Google地图瓦片爬虫
地图地址说明 1、谷歌矢量(中文标注) http://mt{0-3}.google.cn/vt/vm416115521&hlzh-CN&glcn&x{x}&y{y}&z{z}&sGalileo 2、谷歌矢量(英文标注) http://mt{0-3}.google.cn/vt/vm416115521&hlen&glcn&x{x}&y{y}&z{z}&sGali…...
【C++】size_t全面解析与深入拓展
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯一、什么是size_t?为什么需要size_t? 💯二、size_t的特性与用途1. size_t是无符号类型示例: 2. size_t的跨平台适应性示例对…...
Web端实时播放RTSP视频流(监控)
一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <...
学习 Git 的工作原理,而不仅仅是命令
Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的,用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此,如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用,那…...
C语言变长嵌套数组常量初始化定义技巧
有时候,我们需要在代码里配置一些常量结构,比如一个固定的动作流程ActionFlow:包含N(即flow_num)个动作列表(ActionArray),每个动作列表包含M(即act_num)个可…...
如何查看特定版本的Spring源码
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
福田网站设计处理/域名注册查询入口
一、数组的链式描述 在链式描述中,数据对象实例的每一个元素都用一个单元或结点来描述。结点不必是数据成员,因此不是用公式来确定元素位置。取而代之的是,每一个结点都包含另一个相关结点的位置信息,这个信息称为链或指针。 设L(…...
上海城乡建设网站/近期的时事热点或新闻事件
最近想分析一下四大名著生僻字数量,苦于没有质量好的txt文本。解决方案有两个,一是自己从pdf或epub上提取,二是找txt版本。后来在知乎上知道了殆知阁,不知道这个资料库质量如何? 网上回答: 我下载下来看了&…...
电子工程网/北京谷歌seo
Vue开发搭建(npm安装vue脚手架安装)一、使用之前,我们先来掌握3个东西是用来干什么的。二、测试NPM安装vue-router一、使用之前,我们先来掌握3个东西是用来干什么的。 npm: Nodejs下的包管理器。 webpack: 它主要的用途是通过Com…...
visual composer wordpress.org/百度手机卫士
axelor是由法国公司Axelor (https://www.axelor.com)推出的开源java快速开发平台和中型erp应用系统,基于标准的三层开发架构,orm使用jpa,权限验证使用shiro,界面通过xml配置,前后端分离前台通过ajax/json和后端交互,提供pc和手机操…...
免费网站加速软件/株洲网络推广
在MyEclipse中的Visual SQL查询编辑器可用于轻松创建复杂的SQL语句,同时还无需记住其语法。不仅如此,它还利用易于使用的向导来直观地添加表、创建连接、管理组、表达式以及输出命令等等。在本教程中,您将学习到: 打开Visual SQL…...
wordpress 添加js/网站怎么开发
Android官方文档中Supported Media Formats部分介绍了Android支持的多媒体格式,Android支持的图片格式如下图。 本文对这几种图片格式做个学习总结 JPEG JPEG(发音为jay-peg, IPA:[ˈdʒeɪpɛg])是一种针对照片视频而广泛使用的一…...