5.2 汇编语言:标志位测试指令

汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。

标志位测试指令是汇编语言中用于测试处理器标志位状态的指令。标志位是位于处理器状态寄存器中的一组特殊标志,用于指示上一个运算的结果是否为零、是否进位/借位、是否溢出等等。可以使用标志位测试指令来检查标志位的状态,并在需要时根据标志位状态进行操作。

常见的标志位测试指令包括:

  • test 指令:测试指定寄存器中的值与另一个值(常数或寄存器)的按位与操作结果,而不改变寄存器的值。如果结果为零,将设置零标志位ZF。
  • cmp 指令:比较两个操作数并确定它们是否相等;如果两个操作数相等,则设置ZF标志位。使用此指令时,通常将第一个操作数减去第二个操作数,并且不需要保存差值。
  • and 指令:对两个操作数进行逐位与操作,并将结果写入目标操作数。如果结果为零,将设置ZF标志位。
  • or 指令:对两个操作数进行逐位或操作,并将结果写入目标操作数。如果结果为零,将清除ZF标志位。
  • xor 指令:对两个操作数进行逐位异或操作,并将结果写入目标操作数。如果结果为零,将设置ZF标志位。

2.1 PSR

标志寄存器又称程序状态寄存器(Program Status Register,PSR),是CPU中存放处理器标志位的寄存器。它记录了上一个操作的结果,这些结果可以用于下一条指令的条件转移或其他操作。标志寄存器通常包含一些二进制位(标志位),每个标志位用于表示不同的条件或状态。不同的架构和体系结构会有不同的标志位设置。

常见的标志位包括:

  • 零标志位(Zero Flag,ZF):当上一个操作的结果为零时,将设置该标志位。
  • 进位标志位(Carry Flag,CF):当上一个操作的结果产生了进位或借位时,将设置该标志位。
  • 溢出标志位(Overflow Flag,OF):当上一个操作的结果产生了溢出时,将设置该标志位。
  • 符号标志位(Sign Flag,SF):当上一个操作的结果为负数时(最高位为1),将设置该标志位。
  • 奇偶校验标志位(Parity Flag,PF):当上一个操作的结果具有偶数个二进制位为1时,将设置该标志位。

这些标志位通常用于指令的条件分支操作,例如 jz(零标志位为真时跳转)、jnz(零标志位为假时跳转)等。直接操作这些标志位可能会对系统的运行产生影响,因此在编程时应该使用相应的指令来读写标志寄存器状态。

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROC; CF 进位标志位: 当执行一个加法(或减法)运算,使最高位产生进位(或借位)时,CF为1;否则为0mov ax,0ffffhadd ax,1    ; cf = 1 af = 1; PF 奇偶标志位: 当运算结果中,所有bit位(例:1001010)中1的个数为偶数时,则PF=1;为基数PF=0mov eax,00000000badd eax,00000111b  ; pf = 0mov eax,00000000badd eax,00000011b  ; pf = 1; ZF 零标志位: 若当前的运算结果为零,则ZF=1; 否则ZF=0mov eax,2sub eax,2   ; zf = 1 cf = 0 af = 0; SF 符号标志位: 若运算结果为负数,则SF=1;若为非负数则SF=0mov eax,3e8hsub eax,3e9h  ; sf = 1 cf = 1 af = 1 zf = 0; DF 方向标志位: 当DF=0时为正向传送数据(cld),否则为逆向传送数据(std)cldmov eax,1      ; df = 0stdmov eax,1      ; df = 1; OF 溢出标志位: 记录是否产生了溢出,当补码运算有溢出时OF=1;否则OF=0mov al,64hadd al,64h     ; of = 1 cf = 0 pf = 0 af = 0invoke ExitProcess,0main ENDP
END main

2.2 TEST

TEST 指令是一种逻辑操作指令,用于执行两个操作数的逐位AND运算,不改变目标操作数的值,只设置相应的标志位,常用于测试某些位是否被设置。

该指令的语法为:

TEST dest, src

其中,dest是目标操作数,src是源操作数,两个操作数可以是寄存器或内存地址。

执行TEST指令时,CPU将目标操作数和源操作数直接逐位AND运算,结果并不保存到任何位置。但同时,CPU会设置目标操作数的条件码标志位,以反映运算的结果。具体地,CPU会根据运算结果将零标志位(ZF)和进位标志位(CF)设置或清空,符号标志位(SF)和溢出标志位(OF)未定义。

TEST 指令通常用于测试某些位是否被设置,可以通过与一个掩码进行TEST和来测试某一位(或一组位)是否被置位。例如,要测试寄存器eax 是否为偶数,可以使用以下代码:

test eax, 1
jz even_number

在这个代码中,使用TEST指令将eax和常数1逐位AND运算,并将结果保存到条件码标志位中。如果eax的最低位为0,则ZF处于设置状态,执行jz指令跳转到even_number标号处,否则继续执行后续指令。

TEST指令可以同时检测设置多个标志位的值,该指令执行时总是清除溢出标志和进位标志,它修改符号标志,基偶标志,零标志的方式与AND指令相同。

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROCmov al,00001111btest al,2            ; zf=0 pf=0mov al,00100101btest al,00001001b    ; zf=0 pf=0mov al,00100100btest al,00001001b    ; zf=1 pf=1mov eax,0100htest eax,eax         ; zf=0mov eax,0test eax,eax         ; zf=0or al,80h            ; 设置符号标志 zf=0 pf=0 sf=1and al,7fh           ; 清除符号标志 zf=1 pf=1 sf=0mov al,0or al,1              ; 清除符号标志 zf=0 pf=0stc                  ; 设置进位标志 cf = 1clc                  ; 清除进位标志 cf = 0mov al,07fh          ; AL = +127inc al               ; 设置溢出标志 AL = 80h (-128) of=1 af=1 sf=1or eax,0             ; 清除溢出标志invoke ExitProcess,0main ENDP
END main

2.3 CMP

CMP 指令是一种比较指令,通常用于比较两个操作数的大小关系,并根据比较结果设置相应的条件码标志位。

该指令的语法与SUB指令相同,但是CMP指令不会改变目标操作数的值,只对源操作数和目标操作数进行逐位减法运算,并根据运算结果设置标志位。具体地,CMP指令执行DEST - SRC的减法运算,但不保存结果,只把运算结果的条件码标志位设置为反映运算结果的值。

根据CMP指令所设置的标志位,可以通过条件跳转指令来实现跳转。例如,要判断eax是否为0并跳转到标号END,可以使用以下代码:

cmp eax, 0
je END

在这个代码中,CMP指令将eax0相减,不保存结果,而是设置相应的条件码标志位。如果eax等于0,则ZF处于设置状态,条件跳转指令je跳转到END标号处。如果eax不等于0,则ZF处于未设置状态,不会执行跳转指令,而是继续执行后续指令。

如下代码片段则是CMD指令的更多使用方法,读者可自行编写代码进行测试,根据注释信息相信很容易理解。

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROC; 比较5和10mov ax,5cmp ax,10      ; 5-10 > zf=0 cf=1 pf=0 af=1 sf=1; 比较两个相同数mov ax,1000mov cx,1000cmp cx,ax      ; 1000-1000 > zf=1 cf=0 pf=1 sf=0; 比较100和0mov ax,100cmp ax,0       ; 100-0 > zf=0 cf=0 pf=0; 比较100和50mov eax,100mov ebx,50cmp eax,ebx    ; 100-50 > zf=0 cf=0 pf=0; 比较-100和50mov eax,-100mov ebx,50cmp eax,ebx    ; -100-50 > sf=1 pf=1; 比较-100和-50mov eax,-100mov ebx,-50cmp eax,ebx    ; -100--50 > cf=1 af=1 pf=0invoke ExitProcess,0main ENDP
END main

2.4 JX/JNX/JSX/JPX

汇编语言中的跳转指令可以根据条件码标志位来判断条件是否成立,并根据判断结果来跳转到指定的地址。以下是基于特定 CPU 标志寄存器来实现跳转的常见指令及其含义:

  • JZ / JE:当零标志位 (ZF) 为 1 时跳转,即前一个操作执行结果为零。
  • JNZ / JNE:当零标志位 (ZF) 为 0 时跳转,即前一个操作执行结果不为零。
  • JC / JB / JNAE:当进位标志位 (CF) 为 1 时跳转,即前一个操作执行结果产生了进位或借位。
  • JNC / JNB / JAE:当进位标志位 (CF) 为 0 时跳转,即前一个操作执行结果没有产生进位或借位。
  • JO:当溢出标志位 (OF) 为 1 时跳转,即前一个操作执行结果产生了溢出。
  • JNO:当溢出标志位 (OF) 为 0 时跳转,即前一个操作执行结果没有产生溢出。
  • JS:当符号标志位 (SF) 为 1 时跳转,即前一个操作执行结果为负数。
  • JNS:当符号标志位 (SF) 为 0 时跳转,即前一个操作执行结果为非负数。
  • JP / JPE:当奇偶校验标志位 (PF) 为 1 时跳转,即前一个操作执行结果具有偶数个二进制位为 1。
  • JNP / JPO:当奇偶校验标志位 (PF) 为 0 时跳转,即前一个操作执行结果不具有偶数个二进制位为 1。

以上这些跳转指令中,条件判断所依赖的条件码标志位是由前一条指令执行结果所决定的,因此在使用跳转指令时需要注意前一条指令的结果是否符合预期。同时,在跨过一些较大距离的内存位置时,还需要确保指令地址是否能够被正确地计算和访问。

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROC; JZ/JE 当ZF置1时 也就是结果为零则跳转 (leftOp - rightOp = 0)mov eax,1sub eax,1     ; zf=1 pf=1je jumpmov eax,1mov ebx,1cmp eax,ebx   ; zf=1jz jump; JNZ/JNE 当ZF置0时 也就是结果不为零则跳转 (leftOp - rightOp != 0)mov eax,2sub eax,1jnz jump      ; zf=0 pf=0mov eax,2cmp eax,1jne jump      ; zf=0; JC/JNC 当 CF=1/0 设置进位标志则跳/未设置进位标志则跳mov al,0cmp al,1jc jumpjnc jump; JO/JNO 当 OF=1/0 设置溢出标志则跳/未设置溢出标志则跳mov al,0ffhadd al,1jo jump; JS/JNS 当 SF=1/0 设置符号标志则跳/未设置符号标志则跳mov eax,1cmp eax,1js jump       ; cf=0 af=0; JP/JNP PF=1/0 设置奇偶标志则跳(偶)/未设置奇偶标志则跳(基)mov al,00100100bcmp al,0jp jump        ; zp=0jump:xor eax,eaxxor ebx,ebxinvoke ExitProcess,0main ENDP
END main

跳转指令与比较指令可以很好的结合起来,通过使用cmp eax,ebx比较等式两边的值,影响相应的标志寄存器中的值,从而决定是否要跳转,常用的如下:

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROC; JA(无符号)/JG(有符号) 跳转标志: (left > right) 大于则跳转mov eax,100mov ebx,200cmp ebx,eax    ; 无符号 ebx > eaxja jump        ; zf=0 pf=0mov eax,20mov ebx,-100cmp eax,ebx    ; 有符号 eax > ebxjg jump        ; zf=0 cf=1 pf=1 af=1; JAE(无符号)/JGE(有符号) 跳转标志: (left >= right) 大于或等于则跳转mov eax,50mov ebx,20cmp eax,ebx    ; 无符号 eax >= ebxjae jump       ; jae 被替换成了jnb 小于则跳 (eax<ebx)mov eax,50mov ebx,-20cmp eax,ebx    ; 有符号 eax >= ebxjge jump       ; zf=0 af=1 pf=0 sf; JB(无符号)/JL(有符号) 跳转标志:(left < right) 小于则跳转mov eax,10mov ebx,20cmp eax,ebx     ; 无符号 eax < ebxjb jump         ; cf=0 af=0 pf=1mov eax,-10mov ebx,20cmp eax,ebx     ; 有符号 eax < ebxjl jump; JBE(无符号)/JLE(有符号) 跳转标志:(left <= right) 小于或等于则跳转mov eax,20mov ebx,20cmp eax,ebx    ; 无符号 eax <= ebxjbe jump       ; zf=1mov eax,-20mov ebx,10cmp eax,ebx    ; 无符号 eax,ebxjle jump       ; sf=1; JNB(不小于则跳 同JAE)/JNA(不大于则跳 同JBE) 跳转标志:(lef !>< right) 无符号mov eax,10mov ebx,5cmp eax,ebx    ; eax !< ebxjnb jump       ; zf=0 cf=0mov eax,5mov ebx,10cmp eax,ebx    ; eax !> ebxjbe jump       ; cf=1 af=1 zf=0; JNL(不小于则跳 同JGE)/JNG(不大于则跳 同JLE) 跳转标志:(lef !>< right) 有符号mov eax,10mov ebx,-5cmp eax,ebx    ; eax !< ebxjnl jump       ; sf=0 cf=1 pf=1 af=1 zf=0mov eax,-10mov ebx,5cmp eax,ebx    ; eax !> ebxjng jump       ; sf=1jump:xor eax,eaxxor ebx,ebxinvoke ExitProcess,0main ENDP
END main

2.5 BT/BTR/BSF/BSR

BT 系列指令主要用于对特定寄存器中的位进行测试、清除、设置或求反等操作,这些操作通常会影响条件码寄存器CF的值。这些指令的具体操作如下:

  • BT 指令:测试特定寄存器中的位是否为 1,将测试结果存储在条件码寄存器CF的最低位中,即CF的值等于被测试位的值。
  • BTC 指令:将特定寄存器中的位取反,被取反的位由CF最低位指示,即如果CF1,则对应位取反;否则不变。
  • BTR 指令:将特定寄存器中的位清零,被清零的位由CF最低位指示,即如果CF1,则对应位清零;否则不变。
  • BTS 指令:将特定寄存器中的位设置为 1,被设置的位由CF最低位指示,即如果CF为 1,则对应位设置为 1;否则不变。

相比之下,BSFBSR指令则是对特定数据中的位进行正反向扫描操作,进而得到位中第一个1和最后一个1的位置,这些操作通常会影响条件码寄存器ZF的值。这两个指令的具体操作如下:

  • BSF 指令:从寄存器或内存中获取一个WORDDWORD数据,从低位到高位扫描,找到第一个值为1的位,将该位的偏移量存储在目标寄存器中,并将条件码寄存器ZF设置为相应的值,如果未找到值为1的位,则目标寄存器的值未定义,且ZF被清零。

  • BSR 指令:从寄存器或内存中获取一个WORDDWORD数据,从高位到低位扫描,找到最后一个值为1的位,将该位的偏移量存储在目标寄存器中,并将条件码寄存器ZF设置为相应的值,如果未找到值为1的位,则目标寄存器的值未定义,且ZF被清零。

如下代码片段则是指令的更多使用方法,读者可自行编写代码进行测试,根据注释信息相信很容易理解。

  .386p.model flat,stdcalloption casemap:noneinclude windows.inc
include kernel32.inc
includelib kernel32.lib.codemain PROC; bt 普通的位测试命令xor edx,edxmov dx,10000001bbt dx,7              ; 把DX第7位送入CF = 1bt dx,6              ; 把DX第六位送入CF = 0; bts 位测试并置位mov dx,10000001bbts dx,6             ; cf = 0bts dx,7             ; cf = 1; btr 位测试并复位.在执行BT同时,把操作数的指定位置为0mov dx,10000001bbtr dx,7btr dx,6             ; cf = 0;btc 位测试并取反.在执行BT同时,把操作数的指定位取反mov dx,10000001bbtc dx,0             ; cf = 1btc dx,0             ; cf = 0; BSF 执行位扫描 由低->高位 | BSR 由高 -> 到低xor edx,edxmov dx, 0000111100001100bbsf cx,dx            ; 正向扫描,将扫描到1的位置放入CXbsr cx,dx            ; 反向扫描 zf=0 pf=0xor ecx,ecxmov cx,0mov dx,0bsf cx,dxlahfinvoke ExitProcess,0main ENDP
END main

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/3125ea93.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春秋云镜 CVE-2019-2725

春秋云镜 CVE-2019-2725 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 靶标介绍 Oracle Fusion Middleware&#xff08;子组件&#xff1a;Web Services&#xff09;的 Oracle WebLogic Server 组件中的漏洞。受影响的受支持版本为 10.3.6.0.0 和 12.1.3.0.0。…

cornerstoneJS加载图片(base、矩阵)

cornerstoneJS默认加载dicom影像数据&#xff0c;将识别到的dicom数据转换成imageData数据&#xff0c;在界面上展示。故&#xff0c;cornerstoneJS也可直接加载imageData。 imageData数据的data是一个数组&#xff0c;每四个元素代表一个点&#xff0c;四个元素分别表示R、G、…

油画欣赏|《纯洁的梦乡》,心中的宇宙

《纯洁的梦乡》 80x60cm 陈可之2021年绘 油画《纯洁的梦乡》&#xff0c;以绮丽的想象&#xff0c;精湛的技艺&#xff0c;描绘出梦境中的蜻蜓、山、水、星空等事物&#xff0c;展现出一个纯洁美好的心灵宇宙世界。 油画采用水平构图的方式&#xff0c;在位置偏低的山脚设置水…

Java实现单例模式的几种方法

单例模式作为23中设计模式中最基础的设计模式&#xff0c;一般实现方式为 ①私有化构造方法 ②提供一个获取对象的静态方法 除此之外&#xff0c;实现单例模式的方法还有很多种&#xff0c;这篇文章主要介绍实现单例模式的几种方法。 目录 一、懒汉式单例 二、懒汉式单例优化…

分析Flink,源和算子并行度不一致时,运行一段时间后,看似不再继续消费的问题,提供解决思路。

文章目录 背景分析 问题来了比较一开始的情况解决方式 背景 之前有分析过一次类似问题&#xff0c;最终结论是在keyby之后&#xff0c;其中有一个key数量特别庞大&#xff0c;导致对应的subtask压力过大&#xff0c;进而使得整个job不再继续运作。在这个问题解决之后&#xff…

信息经济环境下 OSSP 的目标和基本思想

在信息经济环境下&#xff0c;OA 系统软件的应用十分广泛&#xff0c;对于企业内部OA 系统软件 的开发管理&#xff0c;一直是很多企业信息化建设的一个重点内容&#xff0c;鉴于不同企业所面临的 环境和企业经营项目的差别&#xff0c;每个企业的OA 系统应该是符合内部应用特…

UG\NX二次开发 创建中心线

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: 下面是在制图模块创建中心线的例子,用的是ufun函数。 效果: 代码: #include "me.hpp"#include <stdio.h> #include <string.h> #include <uf.h>…

postgresql 谨慎使用正则删除(%,_)

建表 CREATE TABLE public.ellistest (id bigserial NOT NULL,"name" varchar null,primary key (id) );插入数据 删除含有_线的数据 你会发现表被清空了 delete from ellistest where name like %_%原因 百分号(%)用于表示0、1或多个字符或数字。 下划线通配符…

Java面试题--SpringCloud篇

一、Spring Cloud 1. 什么是微服务架构&#xff1f; 微服务架构就是将单体的应用程序分成多 个应用程序&#xff0c;这多个应用程序就成为微服 务&#xff0c;每个微服务运行在自己的进程中&#xff0c;并 使用轻量级的机制通信 这些服务围绕业务能力来分&#xff0c;并通过自…

【【萌新的STM32学习-12】】

萌新的STM32学习-12 GPIO八种模式 1输入浮空 输入用&#xff0c;完全浮空&#xff0c;状态不定 2输入上拉 输入用&#xff0c;用内部上拉&#xff0c;默认是高电平 3输入下拉 输入用&#xff0c;用内部下拉&#xff0c;默认是低电平 4模拟功能 ADC DAC 5开漏输出 软件IIC的…

2023年上半年,吉利汽车销量增长13.1%,同比增长38%

根据吉利汽车发布的中期业绩报告&#xff0c;2023年上半年&#xff0c;吉利汽车取得了令人瞩目的销售和收入增长。该公司在中国乘用车市场表现出色&#xff0c;销量增长了13.1%&#xff0c;达到了69.4万辆&#xff0c;超过了整体市场增长率&#xff08;8.8%&#xff09;。 这主…

Gitlab部署和基础使用

一. 环境准备 1.1 Ubuntu 环境 允许 root 远程 ssh 连接 ~$ sudo su - root [sudo] password for stevenux: ~# passwd Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully ~# vim /etc/ssh/sshd_config ... PermitRootLogin yes P…

学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯

文章目录 第六集&#xff08;下&#xff09;课后练习解答&#xff1a;SOS求救灯光编写求救信号原理冲哥代码及解析分模块设计&#xff1a;math.h&#xff1a;math.c:while主程序部分 按键点灯&#xff08;下&#xff09;1.按键的原理Tips&#xff1a;按键消抖 2.按键的代码实现…

python 基础篇 day 1 初识变量和数据类型

文章目录 变量变量作用——用于存储和表示数据。变量命名规则命名法大驼峰小驼峰下划体n j i a x 通常作为临时变量使用 建议 变量种类全局变量&#xff08;Global Variables&#xff09;局部变量&#xff08;Local Variables&#xff09;静态变量&#xff08;Static Variables…

九耶丨阁瑞钛伦特-请描述一下如何用Axure绘制banner图效果,并且将这个功能进行详细描述。

第一步&#xff1a;准备图片 首先准备三张大小相同的图片。 第二步&#xff1a;创建动态面板 右键点击第一张图片&#xff0c;唤起菜单&#xff0c;选择“创建动态面板”。 双击动态面板&#xff0c;进入动态面板编辑界面。点击“复制状态”图标&#xff0c;复制出三个状态…

在vue3+ts项目里使用query和params传参

在Vue 3 TypeScript项目中&#xff0c;您可以使用query和params来传递参数。以下是如何在Vue 3 TypeScript中使用这两种方式进行参数传递的示例&#xff1a; // 路由配置 import { createRouter, createWebHistory, RouteRecordRaw } from vue-router;const routes: Array&l…

万宾科技22款产品入选《城市生命线安全工程监测技术产品名录》

2023年8月17日-18日&#xff0c;由北京市地下管线协会主办的2023首届城市生命线安全与发展大会在北京召开&#xff0c;本次大会汇聚中央及地方政府主管领导、院士专家、行业领袖、龙头代表、产业精英等。 大会聚焦安全监管智慧平台和燃气爆炸、城市内涝、地下管线交互风险、第三…

解决Spring mvc + JDK17@Resource无法使用的情况

问题描述 我在使用jdk17进行Spring mvc开发时发现 Resource用不了了。 原因 因为JDK版本升级的改动&#xff0c;在Jdk9~17环境下&#xff0c;搭建Springboot项目&#xff0c;会出现原有Resource&#xff08;javax.annotation.Resource&#xff09;不存在的问题&#xff0c;导…

3.Docker 搭建 MySQL8.0

1、docker仓库搜索mysql docker search mysql2、docker仓库拉取mysql8.0 docker pull mysql:8.0 备注&#xff1a; docker pull mysql //默认拉取最新版本3、查看本地仓库镜像是否下载成功 docker images mysql:8.04、安装运行mysql8.0容器 docker run -p 3306:3306 --name…

全流程R语言Meta分析核心技术

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…