玩一玩 Ubuntu 下的 VSCode 编程

这篇具有很好参考价值的文章主要介绍了玩一玩 Ubuntu 下的 VSCode 编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:背景

1. 讲故事

今天是五一的最后一天,想着长期都在 Windows 平台上做开发,准备今天换到 Ubuntu 系统上体验下,主要是想学习下 AT&T 风格的汇编,这里 Visual Studio 肯定是装不了了,还得上 VSCode,刚好前几天买了一个小工控机,这里简单记录下 零到一 的过程吧。

二:搭建一览

1. VSCode 安装

在 Ubuntu 上也有类似 Windows 的微软商店的 软件市场,可以在商店中直接安装。

玩一玩 Ubuntu 下的 VSCode 编程

既然要换体验,那就多用命令的方式安装吧。


sudo apt update

sudo apt install software-properties-common apt-transport-https wget

wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"

sudo apt install code

code

2. gcc 安装

由于 ubuntu 自带了 gcc,g++,gdb 所以这一块大家不需要操心,可以用 -v 观察各自的版本。


skyfly@skyfly-virtual-machine:~/Desktop$ g++ -v
nux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) 

skyfly@skyfly-virtual-machine:~/Desktop$ gdb -v
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2

3. 配置 vscode

为了能够让 vscode 跑 C++ 程序,先配置下 launch.json 文件。


// An highlighted block
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/${fileBasenameNoExtension}.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "preLaunchTask": "build",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

再配置下 tasks.json 文件。


{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-std=c++11",
                "-o",
                "${fileBasenameNoExtension}.out"
            ]
        }
    ]
}

然后在 VSCode 面板中安装下 GDB DebugC/C++ Extension Pack 两个插件,其他都是附带上去的,截图如下:

玩一玩 Ubuntu 下的 VSCode 编程

3. 一个简单的程序测试

为了方便体验 AT&T 风格,写一个多参数的方法,顺带观察寄存器传值。


#include <iostream>

using namespace std;

int mytest(int a, int b, int c, int d, int e, int f, int g)
{
    printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d", a, b, c, d, e, f, g);

    return 0;
}

int main()
{
    int a = 10;
    int b = 11;
    int c = 12;
    int d = 13;
    int e = 14;
    int f = 15;
    int g = 16;

    mytest(a,b,c,d,e,f,g);
}

mytest 方法下一个断点,然后在 DEBUG CONSOLE 窗口输入 -exec disassemble /m 就能看到本方法的汇编代码,截图如下:

玩一玩 Ubuntu 下的 VSCode 编程

仔细观察上图,可以看到 mytest 方法的前六个参数依次使用了 edi, esi, edx, ecx, r8d, r9d 寄存器,虽然都是 X64 调用协定,和 Windows 平台的4个寄存器有明显不同哈。

既然都看了默认的x64,不看 x86 的传递就有点遗憾哈,要想编译成 32bit 的,需要做一些简单配置。


$ sudo apt-get install build-essential module-assistant  
$ sudo apt-get install gcc-multilib g++-multilib  

然后在 g++ 编译时增加 -m32 参数,在 tasks.json 中增加即可。


{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": [
                "-g",
                "-m32",
                "${file}",
                "-std=c++11",
                "-o",
                "${fileBasenameNoExtension}.out"
            ]
        }
    ]
}

接下来观察下汇编代码,可以发现走的都是 栈空间


24	    mytest(a,b,c,d,e,f,g);
=> 0x565562a2 <+80>:	sub    $0x4,%esp
   0x565562a5 <+83>:	pushl  -0xc(%ebp)
   0x565562a8 <+86>:	pushl  -0x10(%ebp)
   0x565562ab <+89>:	pushl  -0x14(%ebp)
   0x565562ae <+92>:	pushl  -0x18(%ebp)
   0x565562b1 <+95>:	pushl  -0x1c(%ebp)
   0x565562b4 <+98>:	pushl  -0x20(%ebp)
   0x565562b7 <+101>:	pushl  -0x24(%ebp)
   0x565562ba <+104>:	call   0x5655620d <mytest(int, int, int, int, int, int, int)>
   0x565562bf <+109>:	add    $0x20,%esp

还有一个问题,在x86下能不能混着用寄存器呢?就比如 windows 上的 fastcall 调用协定,其实是可以的,就是在 mytest 方法上加 __attribute__((regparm(N))) 标记,这里的 N 不能超过 3 ,即参与传递的寄存器个数,修改后如下:


__attribute__((regparm(3)))
int mytest(int a, int b, int c, int d, int e, int f, int g)
{
    printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d", a, b, c, d, e, f, g);

    return 0;
}

然后把程序跑起来再次观察,很明显的看到这次用了 eax, edx, ecx 来传递方法的前三个参数,汇编代码如下:


24	    mytest(a,b,c,d,e,f,g);
=> 0x565562aa <+80>:	mov    -0x1c(%ebp),%ecx
   0x565562ad <+83>:	mov    -0x20(%ebp),%edx
   0x565562b0 <+86>:	mov    -0x24(%ebp),%eax
   0x565562b3 <+89>:	pushl  -0xc(%ebp)
   0x565562b6 <+92>:	pushl  -0x10(%ebp)
   0x565562b9 <+95>:	pushl  -0x14(%ebp)
   0x565562bc <+98>:	pushl  -0x18(%ebp)
   0x565562bf <+101>:	call   0x5655620d <mytest(int, int, int, int, int, int, int)>
   0x565562c4 <+106>:	add    $0x10,%esp

三:总结

习惯了 Intel 风格的汇编,再看 AT&T 风格的会极度不舒服,简直是逆天哈,感觉都是反方向的,相信熟悉一段时间之后就好了,本篇的一个简单搭建,希望对你有帮助。文章来源地址https://www.toymoban.com/news/detail-432295.html

到了这里,关于玩一玩 Ubuntu 下的 VSCode 编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu20.04一键安装VScode搭建ROS编程环境

    VSCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。

    2023年04月24日
    浏览(50)
  • Java编程与电脑生产力的奇妙故事

    博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄

    2024年02月04日
    浏览(30)
  • 从项目中突显技能:在面试中讲述你的编程故事

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月11日
    浏览(37)
  • VsCode美化 - VsCode自定义 - VsCode自定义背景图

    作为一个二刺螈,VsCode用久了,总觉得少了些什么。是啊,高效的代码生产工具中怎么能没有老婆呢? 那就安装一个VsCode插件把老婆添加到VsCode中吧! 安装 方法一 直接在VsCode的插件中搜索 background (或者 Ctrl + P - ext install background - Enter ),点击第一个安装即可。 方法二

    2024年02月13日
    浏览(40)
  • 基于大数据背景下的全国各大城市地铁客流量分析

    目录 第一章 项目介绍 第二章 项目组织与项目计划 第三章 数据采集 3.1 数据采集目标 3.2 数据采集工具与方法 3.3 数据采集流程 3.4 数据采集保存 3.5 本章小结 第四章 数据预处理 4.1 数据预处理的目标 4.2 空值与重复值的处理 4.3 标点符号的处理 4.4 单位标准统一化 4.5 本章小结

    2024年02月11日
    浏览(59)
  • VSCode 如何设置背景图片

     VSCode 设置背景图片 1.打开应用商店,搜索 background ,选择第一个,点击安装。 2. 安装完成后点击设置,点击扩展设置。 3.点击在 settings.json 中编辑。    4.将原代码注释后,加入以下代码。   5. 保存后重启 VSCode 就能看到设置的背景图片啦。 6.最后再点击设置,点击颜色主

    2024年02月06日
    浏览(59)
  • 在VScode中设置背景色

    VScode是一款功能强大的文本编辑器,它提供了许多自定义选项,包括设置背景色。通过调整背景色,您可以根据个人喜好或工作环境来改变编辑器的外观。在本文中,我将向您展示如何在VScode中设置背景色。 要设置背景色,请按照以下步骤进行操作: 步骤 1:打开VScode 首先

    2024年04月12日
    浏览(20)
  • 银行数字化转型导师坚鹏:数字化转型背景下的银行对公客户营销

    数字化转型背景下的银行对公客户营销 课程背景: 数字化转型背景下,很多银行存在以下问题: Ønbsp;不清楚如何搭建金融场景? Ønbsp;不知道如何挖掘客户需求? Ønbsp;不知道如何开展数字化营销? 课程 特色 : Ønbsp;有实战案例 Ønbsp;有原创观点 Ønbsp;有精彩解读 学员收获

    2023年04月19日
    浏览(63)
  • 仿VScode MDK背景配色方案

    效果如果所示 操作方法:备份后修改~/UV4文件夹下的global.prop,用以下的代码代替。 我之前发的一版配色方案,可以选一个用 http://t.csdn.cn/Bk1WC  

    2024年02月15日
    浏览(33)
  • 银行数字化转型导师坚鹏:数字化转型背景下的银行柜员提升之道

    数字化转型背景下的银行柜员提升之道 课程背景: 很多银行都在开展银行数字化运营工作,目前存在以下问题急需解决: lnbsp;不清楚银行数字化运营包括哪些关键工作? lnbsp;不清楚银行数字化运营工作的核心方法论? lnbsp;不清楚银行数字化运营工作能够带来什么? 课程特

    2023年04月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包