王明明的小站 https://mingming.wang/ Recent content on 王明明的小站 Hugo -- gohugo.io zh-CN Sat, 28 Jun 2025 20:45:10 +0800 linux环境下解决文本文件乱码问题 https://mingming.wang/posts/resolving-text-file-encoding-problems-on-linux/ Sat, 28 Jun 2025 20:45:10 +0800 https://mingming.wang/posts/resolving-text-file-encoding-problems-on-linux/ <p>在中文环境下,有些文本文件以 gbk、gb2312 等编码保存,有些软件打开时会出现乱码的情况。<br> 这时需要通过指定正确的编码格式打开文件,或者把这个文件转换为软件默认使用的编码格式,通常使用 UTF-8 编码保存文本文件是更好的选择。</p> <h2 id="查看文件的编码">查看文件的编码 </h2><p>我们可以通过 file 命令查看文件的编码,确认是否需要转换文本的编码或使用指定格式打开文件。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">file -i file.txt </span></span></code></pre></td></tr></table> </div> </div><h2 id="vim中指定文件编码">Vim中指定文件编码 </h2><p>在 Vim 中指定已打开文件的编码格式,可以使用 <code>:e</code> 命令,命令如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">:e ++enc=gbk </span></span></code></pre></td></tr></table> </div> </div><p>在 Vim 打开文件之前指定编码,可以在 vim 命令后添加对应的参数指定编码,这里指定使用 GBK 编码打开文件,命令如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">vim file.txt -c &#34;e ++enc=gbk&#34; </span></span></code></pre></td></tr></table> </div> </div><h2 id="转换文件编码">转换文件编码 </h2><p>如果需要转换文件的编码,可以使用 iconv 命令,这里把一个文件从 GBK 编码转换为 UTF-8,命令如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">iconv -f GBK -t UTF-8 file.txt &gt; dest_file.txt </span></span></code></pre></td></tr></table> </div> </div> 用于Golang项目的Makefile文件 https://mingming.wang/posts/a-basic-golang-project-makefile/ Sun, 20 Apr 2025 18:53:33 +0800 https://mingming.wang/posts/a-basic-golang-project-makefile/ <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-makefile" data-lang="makefile"><span class="line"><span class="cl"><span class="nf">.PHONY</span><span class="o">:</span> <span class="n">todo</span> <span class="n">analyse</span> <span class="n">test</span> <span class="n">coverage</span> <span class="n">run</span> <span class="n">build</span> <span class="n">clean</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nv">COVERAGE_DIR</span> <span class="o">:=</span> ./coverage </span></span><span class="line"><span class="cl"><span class="nv">BUILD_DIR</span> <span class="o">:=</span> ./build </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">todo</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @grep -r --include <span class="s2">&#34;*&#34;</span> --exclude<span class="o">=</span><span class="s2">&#34;Makefile&#34;</span> --exclude-dir<span class="o">=</span><span class="s2">&#34;.git&#34;</span> <span class="s2">&#34;TODO:&#34;</span> . <span class="o">||</span> <span class="nb">true</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">analyse</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @go vet ./... </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">test</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @go <span class="nb">test</span> -cover ./... </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">coverage</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @mkdir -p <span class="k">$(</span>COVERAGE_DIR<span class="k">)</span> </span></span><span class="line"><span class="cl"> @go <span class="nb">test</span> -covermode<span class="o">=</span>count -coverprofile<span class="o">=</span><span class="k">$(</span>COVERAGE_DIR<span class="k">)</span>/cover.out ./... </span></span><span class="line"><span class="cl"> @go tool cover -html<span class="o">=</span><span class="k">$(</span>COVERAGE_DIR<span class="k">)</span>/cover.out -o <span class="k">$(</span>COVERAGE_DIR<span class="k">)</span>/cover.html </span></span><span class="line"><span class="cl"> @open <span class="k">$(</span>COVERAGE_DIR<span class="k">)</span>/cover.html </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">run</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @go run . </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">build</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @go build -o <span class="k">$(</span>BUILD_DIR<span class="k">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">clean</span><span class="o">:</span> </span></span><span class="line"><span class="cl"> @rm -rf <span class="k">$(</span>COVERAGE_DIR<span class="k">)</span> <span class="k">$(</span>BUILD_DIR<span class="k">)</span> </span></span></code></pre></td></tr></table> </div> </div> 在Linux环境下使用Wine运行企业微信 https://mingming.wang/posts/run-wechat-work-on-a-linux-environment-using-wine/ Sat, 18 Jan 2025 15:10:32 +0800 https://mingming.wang/posts/run-wechat-work-on-a-linux-environment-using-wine/ <p>一直以来,从Windows或MacOS切换到Linux最大障碍就是各种常用软件。常用的软件多数可以找到Linux下的替代品,但像QQ、微信、企业微信这些因为腾讯的各种限制,导致各种开源方案都被封杀。而腾讯官方一直又对Linux不怎么上心,导致在Linux下想运行腾讯的软件总是困难重重。好在QQ、微信已经有官方的Linux版本,总算摆脱了无法在Linux下使用的困境。不过Linux版的企业微信依旧遥遥无期,只能通过Wine的方式使用。本文主要记录一下Arch Linux环境下,如何使用Wine运行企业微信。</p> <h2 id="系统环境">系统环境 </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">操作系统: Arch Linux </span></span><span class="line"><span class="cl">KDE Plasma 版本: 6.2.5 </span></span><span class="line"><span class="cl">KDE 程序框架版本: 6.10.0 </span></span><span class="line"><span class="cl">Qt 版本: 6.8.1 </span></span><span class="line"><span class="cl">内核版本: 6.12.9-arch1-1 (64 位) </span></span><span class="line"><span class="cl">图形平台: Wayland </span></span></code></pre></td></tr></table> </div> </div><h2 id="安装wine">安装Wine </h2><p>这里选择 win-staging 版本,对企业微信兼容性好一些。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo pacman -S wine-staging </span></span></code></pre></td></tr></table> </div> </div><h2 id="安装依赖库">安装依赖库 </h2><p>理论上不安装也能使用,只是可能会有一些非致命性的报错。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo pacman -S samba amdvlk </span></span><span class="line"><span class="cl">sudo pacman -S gnutls lib32-gnutls lib32-glibc lib32-libglvnd </span></span><span class="line"><span class="cl">sudo pacman -S mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon vulkan-icd-loader lib32-vulkan-icd-loader lib32-libgl lib32-mesa lib32-vulkan-icd-loader </span></span><span class="line"><span class="cl">sudo pacman -S lib32-libx11 lib32-libxext lib32-libxrender lib32-libxi </span></span></code></pre></td></tr></table> </div> </div><h2 id="安装wine依赖">安装Wine依赖 </h2><p>安装一些必要的字体或wine环境中的依赖,尽量模拟windows环境。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">winetricks -q corefonts fakechinese gdiplus riched20 windowscodecs </span></span></code></pre></td></tr></table> </div> </div><h2 id="安装企业微信">安装企业微信 </h2><ol> <li>使用下面地址下载版本的企业微信。</li> </ol> <blockquote> <p><a class="link" href="https://dldir1.qq.com/wework/work_weixin/WeCom_4.1.10.6013.exe" target="_blank" rel="external nofollow noopener noreferrer" >https://dldir1.qq.com/wework/work_weixin/WeCom_4.1.10.6013.exe</a> </p></blockquote> <ol start="2"> <li>在下载目录下执行 <code>wine WeCom_4.1.10.6013.exe</code> 安装企业微信。或者右键单击 <code>WeCom_4.1.10.6013.exe</code> 文件,选择使用 wine 打开。</li> </ol> <h2 id="修改企业微信启动图标">修改企业微信启动图标 </h2><p>打开企业微信启动图标文件,按如下示例修改 <code>Exec</code> 内容。</p> <blockquote> <p>~/.local/share/applications/wine-Programs-企业微信-企业微信.desktop</p></blockquote> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="o">[</span>Desktop Entry<span class="o">]</span> </span></span><span class="line"><span class="cl">Comment<span class="o">[</span>zh_CN<span class="o">]=</span> </span></span><span class="line"><span class="cl"><span class="nv">Comment</span><span class="o">=</span> </span></span><span class="line"><span class="cl"><span class="nv">Exec</span><span class="o">=</span>env <span class="nv">WINEPREFIX</span><span class="o">=</span>/home/ming/.wine <span class="nv">ENABLE_VULKAN_RENDERDOC_CAPTURE</span><span class="o">=</span><span class="m">0</span> <span class="nv">DXVK_LOG_LEVEL</span><span class="o">=</span>none <span class="nv">GTK_IM_MODULE</span><span class="o">=</span>fcitx <span class="nv">QT_IM_MODULE</span><span class="o">=</span>fcitx <span class="nv">XMODIFIERS</span><span class="o">=</span>@im<span class="o">=</span>fcitx wine <span class="s1">&#39;C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\企业微信\\企业微信.lnk&#39;</span> </span></span><span class="line"><span class="cl">GenericName<span class="o">[</span>zh_CN<span class="o">]=</span> </span></span><span class="line"><span class="cl"><span class="nv">GenericName</span><span class="o">=</span> </span></span><span class="line"><span class="cl"><span class="nv">Icon</span><span class="o">=</span>AF03_WXWork.0 </span></span><span class="line"><span class="cl"><span class="nv">MimeType</span><span class="o">=</span> </span></span><span class="line"><span class="cl">Name<span class="o">[</span>zh_CN<span class="o">]=</span>企业微信 </span></span><span class="line"><span class="cl"><span class="nv">Name</span><span class="o">=</span>企业微信 </span></span><span class="line"><span class="cl"><span class="nv">Path</span><span class="o">=</span>/home/ming/.wine/dosdevices/c:/Program Files <span class="o">(</span>x86<span class="o">)</span>/WXWork </span></span><span class="line"><span class="cl"><span class="nv">StartupNotify</span><span class="o">=</span><span class="nb">true</span> </span></span><span class="line"><span class="cl"><span class="nv">StartupWMClass</span><span class="o">=</span>wxwork.exe </span></span><span class="line"><span class="cl"><span class="nv">Terminal</span><span class="o">=</span><span class="nb">false</span> </span></span><span class="line"><span class="cl"><span class="nv">TerminalOptions</span><span class="o">=</span> </span></span><span class="line"><span class="cl"><span class="nv">Type</span><span class="o">=</span>Application </span></span><span class="line"><span class="cl">X-KDE-SubstituteUID<span class="o">=</span><span class="nb">false</span> </span></span><span class="line"><span class="cl">X-KDE-Username<span class="o">=</span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="运行企业微信">运行企业微信 </h2><p>点击启动菜单中的 企业微信 图标直接运行。</p> <h2 id="效果">效果 </h2><p><img src="https://mingming.wang/posts/run-wechat-work-on-a-linux-environment-using-wine/images/wechat-work.png" width="2915" height="1924" srcset="https://mingming.wang/posts/run-wechat-work-on-a-linux-environment-using-wine/images/wechat-work_hu_c3b70c249454bec3.png 480w, https://mingming.wang/posts/run-wechat-work-on-a-linux-environment-using-wine/images/wechat-work_hu_a15640887970513e.png 1024w" loading="lazy" alt="wechat-work" class="gallery-image" data-flex-grow="151" data-flex-basis="363px" ></p> <p>基本功能都能正常使用,但也有一些小问题。</p> <ol> <li>窗口的 最小化、最大化、关闭 按钮,在切换到其它应用后会残留在其它应该之上。可以通过点击最小化按钮解决。</li> <li>窗口的背景水印如果有中文会显示为方块,不影响使用。</li> <li>窗口边缘会有一圈渲染的不太成功的阴影,不影响使用。</li> <li>工作台中如果有一些应用是基于网页的,可能会无法正常显示,主要是libcef.dll兼容性的问题。</li> </ol> <p>还是希望腾讯能早日发布Linux版的企业微信,毕竟Wine只能解决有无问题,想要好用还是要等原生应用。</p> 如何把qBittorrent数据迁移到其它电脑 https://mingming.wang/posts/how-to-migrate-qbittorrent-to-another-computer/ Sun, 22 Dec 2024 14:01:18 +0800 https://mingming.wang/posts/how-to-migrate-qbittorrent-to-another-computer/ <p>如果你准备更换电脑,但 qBittorrent 存在很多正在做种或未下载完成的任务,需要把 qBittorrent 的任务迁移到新的电脑。但是 qBittorrent 并没有提供任务的导出导入功能,需要我们手动迁移对应的数据。</p> <h2 id="数据所在路径">数据所在路径 </h2><p>在不同操作系统中,qBittorrent 数据存放的路径也不一样,按不同操作系统备份对应路径下的数据。</p> <p><strong>Windows</strong></p> <blockquote> <p>%LOCALAPPDATA%\qBittorrent\BT_backup</p></blockquote> <p><strong>MacOS</strong></p> <blockquote> <p>~/Library/Application Support/qBittorrent/BT_backup</p></blockquote> <p><strong>Linux</strong></p> <blockquote> <p>~/.local/share/qBittorrent/BT_backup</p></blockquote> <p>qBittorrent 其它相关配置所在路径可以参考 <a class="link" href="https://github.com/qbittorrent/qBittorrent/wiki/Frequently-Asked-Questions#where-does-qbittorrent-save-its-settings" target="_blank" rel="external nofollow noopener noreferrer" >官方Wiki</a> </p> <h2 id="备份脚本">备份脚本 </h2><h3 id="windows">Windows </h3><p>将如下脚本保存为 backup.bat 然后执行,数据会备份到脚本所在的目录下。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bat" data-lang="bat"><span class="line"><span class="cl"><span class="p">@</span><span class="k">echo</span> off </span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">NOT</span> <span class="k">EXIST</span> <span class="s2">&#34;</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\BT_backup&#34;</span> <span class="k">GOTO</span> <span class="nl">CfgNotFound</span> </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">EXIST</span> <span class="s2">&#34;.\backup.zip&#34;</span> <span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="k">IF</span> <span class="k">EXIST</span> <span class="s2">&#34;.\backup.old.zip&#34;</span> <span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="k">RD</span> /S /Q <span class="s2">&#34;.\backup.old.zip&#34;</span> </span></span><span class="line"><span class="cl"> <span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">MOVE</span> <span class="s2">&#34;.\backup.zip&#34;</span> <span class="s2">&#34;.\backup.old.zip&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">ECHO</span> 上一次的备份已更名为backup.old.zip </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">zip -r backup.zip <span class="s2">&#34;</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\BT_backup&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">ECHO</span> 备份完成,按任意键结束... </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span><span class="line"><span class="cl"><span class="k">EXIT</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">CfgNotFound</span> </span></span><span class="line"><span class="cl"><span class="k">ECHO</span> 没有找到qBittorrent的任务数据文件,无法进行备份,按任意键结束... </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span></code></pre></td></tr></table> </div> </div><h3 id="macos--linux">MacOS &amp; Linux </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">data_path</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.local/share/qBittorrent/BT_backup&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">system</span><span class="o">=</span><span class="sb">`</span>uname<span class="sb">`</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$system</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nv">data_path</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/Library/Application Support/qBittorrent/BT_backup&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> ! -d <span class="s2">&#34;</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">read</span> -p <span class="s2">&#34;没有找到 qBittorrent 的任务数据文件,无法进行备份,按任意键结束...&#34;</span> -n <span class="m">1</span> -r </span></span><span class="line"><span class="cl"> <span class="nb">exit</span> <span class="m">0</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;./backup.zip&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;./backup.old.zip&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> rm -rf <span class="s2">&#34;./backup.old.zip&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> mv <span class="s2">&#34;./backup.zip&#34;</span> <span class="s2">&#34;./backup.old.zip&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">zip -r backup.tar.gz <span class="s2">&#34;</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">read</span> -p <span class="s2">&#34;备份完成,按任意键结束...&#34;</span> -n <span class="m">1</span> -r </span></span></code></pre></td></tr></table> </div> </div><h2 id="恢复脚本">恢复脚本 </h2><h3 id="windows-1">Windows </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bat" data-lang="bat"><span class="line"><span class="cl"><span class="p">@</span><span class="k">echo</span> off </span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">NOT</span> <span class="k">EXIST</span> <span class="s2">&#34;.\backup.zip&#34;</span> <span class="k">GOTO</span> <span class="nl">SearchBakOld</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">unzip <span class="s2">&#34;.\backup.zip&#34;</span> -d <span class="s2">&#34;</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">ECHO</span> 成功从backup.zip还原任务数据,按任意键结束... </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span><span class="line"><span class="cl"><span class="k">EXIT</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">SearchBakOld</span> </span></span><span class="line"><span class="cl"><span class="k">IF</span> <span class="k">NOT</span> <span class="k">EXIST</span> <span class="s2">&#34;.\backup.old.zip&#34;</span> <span class="k">GOTO</span> <span class="nl">BakNotFound</span> </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">unzip <span class="s2">&#34;.\backup.old.zip&#34;</span> -d <span class="s2">&#34;</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">ECHO</span> 成功从backup.old.zip还原任务数据,按任意键结束... </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span><span class="line"><span class="cl"><span class="k">EXIT</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">:</span><span class="nl">BakNotFound</span> </span></span><span class="line"><span class="cl"><span class="k">ECHO</span> 没有可以使用的备份,还原终止,按任意键结束... </span></span><span class="line"><span class="cl"><span class="k">PAUSE</span> <span class="p">&gt;</span> NUL </span></span></code></pre></td></tr></table> </div> </div><h3 id="macos--linux-1">MacOS &amp; Linux </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">data_path</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.local/share/qBittorrent/&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">system</span><span class="o">=</span><span class="sb">`</span>uname<span class="sb">`</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$system</span><span class="s2">&#34;</span> <span class="o">==</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nv">data_path</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/Library/Application Support/qBittorrent/&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> ! -d <span class="s2">&#34;</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">read</span> -p <span class="s2">&#34;没有找到 qBittorrent 的任务数据文件,无法进行备份,按任意键结束...&#34;</span> -n <span class="m">1</span> -r </span></span><span class="line"><span class="cl"> <span class="nb">exit</span> <span class="m">0</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nv">backup_file</span><span class="o">=</span><span class="s2">&#34;./backup.zip&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">&#34;</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="o">[</span> -f <span class="s2">&#34;./backup.old.zip&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nv">backup_file</span><span class="o">=</span><span class="s2">&#34;./backup.old.zip&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">else</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;没有可以使用的备份,还原终止,按任意键结束...&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">exit</span> <span class="m">0</span> </span></span><span class="line"><span class="cl"> <span class="k">fi</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">unzip <span class="s2">&#34;</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">&#34;</span> -d <span class="s2">&#34;</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">read</span> -p <span class="s2">&#34;成功从</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">还原任务数据,按任意键结束...&#34;</span> -n <span class="m">1</span> -r </span></span></code></pre></td></tr></table> </div> </div> Go1.23中errors.Is新增了一个nil检查 https://mingming.wang/posts/go1.23-errors.is-now-includes-a-nil-check/ Wed, 07 Aug 2024 22:06:00 +0800 https://mingming.wang/posts/go1.23-errors.is-now-includes-a-nil-check/ <h2 id="摘要">摘要 </h2><p>在 Go 1.23 中,errors.Is 函数中添加了一个 nil 检查,可以让处理错误时写出可读性更好的代码。</p> <h2 id="正文">正文 </h2><p>在 Go 1.23 之前,errors.Is 函数中没有检查 err 参数是否为 nil,当时的代码如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">error</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">target</span> <span class="o">==</span> <span class="kc">nil</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span> <span class="o">==</span> <span class="nx">target</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nx">isComparable</span> <span class="o">:=</span> <span class="nx">reflectlite</span><span class="p">.</span><span class="nf">TypeOf</span><span class="p">(</span><span class="nx">target</span><span class="p">).</span><span class="nf">Comparable</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nf">is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> <span class="nx">isComparable</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>因此,要检查函数返回的错误是否为特定的错误,需要像下面这样使用嵌套的 if 语句:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">err</span> <span class="o">:=</span> <span class="nf">foo</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">errorBar</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle error Bar</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">errorBar2</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle error Bar2</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle other errors</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>虽然这段代码看着没有任何问题,当然实际也没有任何问题,只是它看着没有那么的优雅。</p> <p>在 Go 1.23 中,你可以去掉 if 语句的嵌套,只需要一层代码来处理错误检查。这主要是因为现在的 errors.Is 函数做了一些修改,现在代码如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">target</span> <span class="kt">error</span><span class="p">)</span> <span class="kt">bool</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">==</span> <span class="kc">nil</span> <span class="o">||</span> <span class="nx">target</span> <span class="o">==</span> <span class="kc">nil</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span> <span class="o">==</span> <span class="nx">target</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nx">isComparable</span> <span class="o">:=</span> <span class="nx">reflectlite</span><span class="p">.</span><span class="nf">TypeOf</span><span class="p">(</span><span class="nx">target</span><span class="p">).</span><span class="nf">Comparable</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nf">is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">target</span><span class="p">,</span> <span class="nx">isComparable</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>以前,errors.Is 只会检查 target 是否等于 nil,现在还会检查 err 是否为 nil。因此,我们可以把错误检查代码改进如下:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">err</span> <span class="o">:=</span> <span class="nf">foo</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">errorBar</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle error Bar</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">errors</span><span class="p">.</span><span class="nf">Is</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">errorBar2</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle error Bar2</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// handle other errors</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>我相信这种方法比之前的代码更好,虽然只做了一点改变,但与旧的代码相比少了一层嵌套,可读性明显提升。<br> 尽管最初编写代码时看起来很简单,但之前的代码中嵌套的 if 语句可能在以后阅读时更加令人困惑和复杂。<br> 另外可读性较好的代码应该优先考虑正常路径,减少不必要的嵌套深度。</p> <h2 id="结论">结论 </h2><p>在阅读代码时,我注意到 errors.is 函数缺乏空值检查,这导致了诸多错误和不便,对此我感到相当不满。幸运的是,在 Go 1.23 版本中,errors.is 得到了改进。尽管一些 Go 开发者对此持有不同观点,但这一增强无疑将极大地促进我们编写更清晰、更易于维护的代码,同时提升代码的可读性,并降低其复杂性。</p> canal上游数据库迁移方案 https://mingming.wang/posts/canal-upstream-db-migration-plan/ Wed, 31 Jul 2024 07:59:24 +0800 https://mingming.wang/posts/canal-upstream-db-migration-plan/ <p>canal [kə&rsquo;næl] 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。<br> 生产环境中的数据库总会因为各种原因需要迁移,如果这个数据库又是 canal 的上游库,canal 也需要同步修改数据库的相关配置。<br> 如果直接迁移数据库,然后修改 canal 中的数据库配置,会因为与之前数据库的 binlog File、Position 不匹配,导致 canal 报错 <code>can't find start position for example</code>。</p> <h2 id="方案概述">方案概述 </h2><blockquote> <p>注:本次方案不涉及数据库本身的迁移,只包含与 canal 变更相关的内容。</p></blockquote> <p>由于 canal 会记录上游数据库同步的情况,把 binlog File、Position 记录下来,在 Instance 启动时会读取这些记录恢复到上次同步的状态。<br> 所以在迁移上游数据库之前需要修改这些 binlog 信息,具体的迁移步骤如下。</p> <ol> <li>由于迁移数据库需要修改 binlog position 信息,可能会导致部分消息重复发送,需要确保 canal 的下流消费者有幂等性。</li> <li>保证新库已部署完成,并与保持与原库同步。</li> <li>查看新库 binlog File、Position。</li> <li>停止 canal 对应的实例。</li> <li>修改 canal 记录的 binlog position 信息。</li> <li>修改 canal 的上游库的配置信息。</li> <li>启动 canal 对应的实例。</li> <li>验证变更。</li> </ol> <h2 id="迁移方案">迁移方案 </h2><h3 id="查看新库-binlog-position">查看新库 Binlog position </h3><p>连接到新的 MySQL 数据库中,执行如下命令查看 binlog 信息。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">show</span><span class="w"> </span><span class="n">master</span><span class="w"> </span><span class="n">status</span><span class="p">;</span><span class="w"> </span></span></span></code></pre></td></tr></table> </div> </div><p>会显示如下信息,记录下其中的 File、Position。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">mysql&gt; show master status; </span></span><span class="line"><span class="cl">+------------------+-----------+--------------+------------------+-----------------------------------------------------------------------------------------+ </span></span><span class="line"><span class="cl">| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |Executed_Gtid_Set | </span></span><span class="line"><span class="cl">+------------------+-----------+--------------+------------------+-----------------------------------------------------------------------------------------+ </span></span><span class="line"><span class="cl">| mysql-bin.000255 | 226215458 | | | b2d6b3e0-3dd0-11ef-bf73-528c00fbc35b:1-57534559, b2e19ab6-3dd0-11ef-98f0-528c009b3b34:1 | </span></span><span class="line"><span class="cl">+------------------+-----------+--------------+------------------+-----------------------------------------------------------------------------------------+ </span></span><span class="line"><span class="cl">1 row in set (0.03 sec) </span></span></code></pre></td></tr></table> </div> </div><h3 id="停止-canal-实例">停止 canal 实例 </h3><p>这里使用的是 canal admin 进行相关操作,进入到 canal admin 的 Instance 管理界面,找到对应的 instance 并选择<code>操作</code>按钮,然后点击<code>停止</code>。<br> 待操作后,可以点击<code>刷新列表</code>按钮查看操作后的状态。</p> <p><img src="https://mingming.wang/posts/canal-upstream-db-migration-plan/images/canal-admin-stop-instance.png" width="2594" height="1278" srcset="https://mingming.wang/posts/canal-upstream-db-migration-plan/images/canal-admin-stop-instance_hu_ba6f8b2260b097bd.png 480w, https://mingming.wang/posts/canal-upstream-db-migration-plan/images/canal-admin-stop-instance_hu_3e5741ffa1a44fa7.png 1024w" loading="lazy" alt="停止 canal 实例" class="gallery-image" data-flex-grow="202" data-flex-basis="487px" ></p> <h3 id="修改-canal-position-信息">修改 canal position 信息 </h3><p>canal 可以分为 单机部署、集群部署,这两种方式的 position 信息保存的位置是不同的,单机版是保存在本地文件中,集群版是保存在 zookeeper 中,具体路径如下。</p> <blockquote> <p>单机版:<code>cconf/instance/meta.dat</code></p> <p>集群版:<code>/otter/canal/${destinations}/instance/1001/cursor</code></p></blockquote> <p>本次以集群版为例,说明如何修改 zookeeper 中的 position 信息。</p> <ol> <li>先启动一个 zookeeper 的 docker 容器,并进入容器内,利用 zkCli.sh 来连接并操作 zookeeper 相关数据。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker run --rm --name zk --entrypoint sh -ti zookeeper:latest </span></span></code></pre></td></tr></table> </div> </div><blockquote> <p>注:也可以下载 zookeeper 相关文件在本地操作,<a class="link" href="https://zookeeper.apache.org/releases.html" target="_blank" rel="external nofollow noopener noreferrer" >zookeeper 官网</a> </p></blockquote> <ol start="2"> <li>执行如下合集连接并查询当前 canal Instance 的 position 信息。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">./bin/zkCli.sh -server 100.127.9.2:2181 </span></span><span class="line"><span class="cl">get /otter/canal/destinations/testdb_beijing/1001/cursor </span></span></code></pre></td></tr></table> </div> </div><p>会返回如下信息,其中包含了上游数据库地址、端口、binlog file、binlog position 等信息。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">{&#34;@type&#34;:&#34;com.alibaba.otter.canal.protocol.position.LogPosition&#34;,&#34;identity&#34;:{&#34;slaveId&#34;:-1,&#34;sourceAddress&#34;:{&#34;address&#34;:&#34;100.127.9.2&#34;,&#34;port&#34;:3306}},&#34;postion&#34;:{&#34;gtid&#34;:&#34;&#34;,&#34;included&#34;:false,&#34;journalName&#34;:&#34;mysql-bin.003277&#34;,&#34;position&#34;:100389087,&#34;serverId&#34;:1686047208,&#34;timestamp&#34;:1722382660000}} </span></span></code></pre></td></tr></table> </div> </div><ol start="3"> <li>把新库的 binlog file、binlog position 信息修改后,使用 set 命令修改 zookeeper 中的内容。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">set</span> /otter/canal/destinations/testdb_beijing/1001/cursor <span class="o">{</span><span class="s2">&#34;@type&#34;</span>:<span class="s2">&#34;com.alibaba.otter.canal.protocol.position.LogPosition&#34;</span>,<span class="s2">&#34;identity&#34;</span>:<span class="o">{</span><span class="s2">&#34;slaveId&#34;</span>:-1,<span class="s2">&#34;sourceAddress&#34;</span>:<span class="o">{</span><span class="s2">&#34;address&#34;</span>:<span class="s2">&#34;100.127.9.233&#34;</span>,<span class="s2">&#34;port&#34;</span>:3306<span class="o">}}</span>,<span class="s2">&#34;postion&#34;</span>:<span class="o">{</span><span class="s2">&#34;gtid&#34;</span>:<span class="s2">&#34;&#34;</span>,<span class="s2">&#34;included&#34;</span>:false,<span class="s2">&#34;journalName&#34;</span>:<span class="s2">&#34;mysql-bin.000255&#34;</span>,<span class="s2">&#34;position&#34;</span>:226215458,<span class="s2">&#34;serverId&#34;</span>:1686047208,<span class="s2">&#34;timestamp&#34;</span>:1722382660000<span class="o">}}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="修改-canal-上游数据库配置">修改 canal 上游数据库配置 </h3><p>在 canal admin 的 Instance 管理页面中,修改对应 Instance 实例的数据库地址、用户名、密码。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">canal.instance.master.address</span><span class="o">=</span><span class="s">10.127.9.233:3306</span> </span></span><span class="line"><span class="cl"><span class="na">canal.instance.dbUsername</span><span class="o">=</span><span class="s">root</span> </span></span><span class="line"><span class="cl"><span class="na">canal.instance.dbPassword</span><span class="o">=</span><span class="s">root_password</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="启动-canal-实例">启动 canal 实例 </h3><p>在 canal admin 的 Instance 管理页面中,重新启动对应的实例。</p> <h3 id="验证变更">验证变更 </h3><ol> <li>查看 canal Instance 日志是否正常,正常情况下会显示 <code>find start position successfully</code> 并包含新库的 binlog File、Position 等信息。</li> <li>查看 canal 下游 MQ、消费者 是否有新的消息送达。</li> </ol> <h2 id="总结">总结 </h2><ol> <li>确认 canal 的部署方式,单机与集群修改 Position 的方式不同。</li> <li>因为迁移之后会有部分重复的 binlog 消息,所以需要确保 canal 下游消费者的幂等性,避免影响业务。</li> <li>先记录新库 Position ,停止 canal instance,再改 canal Position,避免丢失数据。</li> <li>生产环境一定要有严谨的验证和回退方案,需根据实际情况定制。</li> </ol> 为Firefox配置垂直标签与自动休眠功能 https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/ Sat, 09 Sep 2023 15:22:29 +0800 https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/ <h2 id="背景">背景 </h2><p>以前一直使用 Chrome 浏览器,特点是简洁、纯粹、好用,没有国内浏览器带的臃肿无用的功能,也没有广告,后来因为同步问题( Chrome 同步必需科学上网不方便)投入了 Edge 浏览器的怀抱。<br> 最近发现 Edge 也开始向浏览器添加各种与浏览器无关的功能,变得越来越向国内厂家的风格,准备转用 Firefox 浏览器。<br> Firefox 由非盈利组织 Mozilla 运营,一直都是一个比较纯粹的浏览器软件,没有臃肿的功能和广告。但是 Firefox 相比 Edge 缺少一些实用的功能,比如:垂直标签、标签自动休眠等功能,好在 Firefox 还有强大的扩展机制,通过安装扩展可以达到类似的效果。</p> <h2 id="功能介绍">功能介绍 </h2><p>标签自动休眠:如果你也同时打开很多标签,那么你肯定需要这个功能,能帮助你休眠长时间未操作过的标签页面,大幅度降低内存使用。<br> 垂直标签:对于大屏设备是非常友好的,能充分利用宽屏的空间,还能在标签较多的情况下展示完整的标题,方便选择需要的标签。</p> <h2 id="自动休眠">自动休眠 </h2><p>自动休眠功能我选择的是 “Auto Tab Discard” 扩展,安装和使用都比较简单,不需要繁琐就能使用。</p> <h3 id="安装">安装 </h3><p>通过 Firefox Add-Ons 扩展商店直接搜索 “Auto Tab Discard” 或直接点击链接 <a class="link" href="https://addons.mozilla.org/en-US/firefox/addon/auto-tab-discard/" target="_blank" rel="external nofollow noopener noreferrer" >https://addons.mozilla.org/en-US/firefox/addon/auto-tab-discard/</a> 进入安装页面,然后进行安装即可。</p> <h3 id="配置">配置 </h3><p>安装好之后就能使用,一般不需要特殊配置。</p> <h3 id="效果">效果 </h3><p>默认配置下,不活跃的标签将在 10 分钟后自动进入休眠状态,休眠之后会在标题前显示 💤 图标,点击标签后会重新加载标签。</p> <p><img src="https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/auto_tab_discard.png" width="1104" height="764" srcset="https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/auto_tab_discard_hu_403a88560041d71e.png 480w, https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/auto_tab_discard_hu_17b45fb65b2e0854.png 1024w" loading="lazy" alt="自动休眠效果图" class="gallery-image" data-flex-grow="144" data-flex-basis="346px" ></p> <h2 id="垂直标签">垂直标签 </h2><p><strong>本文基于 <code>Sidebery v4.x</code> ,此扩展的最新版本已更新为 <code>v5.x</code>,部分内容已不适用。</strong></p> <p>垂直标签功能我选择的是 “Sidebery” 扩展,功能比较丰富。支持 Plane &gt; Group &gt; Tab Tree 多级分组、数据同步、Firefox Container绑定、各种配置定制化。</p> <h3 id="安装-1">安装 </h3><p>通过 Firefox Add-Ons 扩展商店直接搜索 “Sidebery” 或直接点击链接 <a class="link" href="https://addons.mozilla.org/en-US/firefox/addon/sidebery" target="_blank" rel="external nofollow noopener noreferrer" >https://addons.mozilla.org/en-US/firefox/addon/sidebery</a> 即可。</p> <h3 id="配置-1">配置 </h3><p>为了充分利用好 <code>Sidebery</code> 的能力,建议进行以下基本功能的配置。</p> <h4 id="隐藏顶部标签栏">隐藏顶部标签栏 </h4><p>当我们安装好 <code>Sidevery</code> 之后,拥有了垂直标签栏,原本的顶部标签栏就没什么用处了,并且还会占用空间影响美观。</p> <ol> <li>在地址栏输入 <code>about:config</code> 回车进入配置页面,然后在搜索栏搜索 <code>toolkit.legacyUserProfileCustomizations.stylesheets</code> 并把值改为 <code>true</code>。</li> <li>在 Firefox 菜单栏依次选择 <code>Help &gt; Troubleshooting Information</code> 进入 <code>Troubleshooting Information</code> 信息页。</li> <li>在 <code>Troubleshooting Information</code> 信息页找到 <code>Profile Folder</code> ,然后点击右侧的 <code>Show in Finder</code>,或者手动进入右侧显示的路径中。</li> <li>在目录下创建 chrome 目录,并在 chrome 目录中创建 <code>userChrome.css</code> 文件。</li> <li>把下面的 CSS 代码添加到 <code>userChrome.css</code> 文件中,并重启 Firefox。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/** 隐藏顶部标签栏 **/</span> </span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">TabsToolbar</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="隐藏-sidebery-header">隐藏 Sidebery Header </h4><p>在 <code>userChrome.css</code> 中添加如下 CSS 代码,可以隐藏 Sidebery 的顶部工具栏,效果上会更美观一些。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">sidebar-header</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h4 id="permissions">Permissions </h4><p>进入 Sidebery 插件配置页面,然后通过左侧菜单找到 Permissions 选项,根据你需要使用的功能为 Sidebery 授权相应的权限。</p> <h4 id="container">Container </h4><p>Container 是 Firefox 提供的一种多账户隔离功能,不同 Container 下页面的 Cookie 是隔离的,可以实现单个站点登录多账号等功能。</p> <p>在 Firefox 官网简介中,Container 主要能用于以下场景:</p> <ol> <li>在一个页面上登录多个账户(例如:个人和工作邮件账号)</li> <li>用VPN保护我的浏览(例如:在国外购物并从本国服务器查看您的银行账户 )</li> <li>阻止跟踪和网络攻击(例如:有害的链接会被存放在链接里)</li> <li>将网站分配给容器(例如:特殊的网页在特殊的容器中打开)</li> <li>隐藏/展示和排序页面(例如:隐藏工作页面并对工作页面和个人页面进行排序)</li> <li>在使用您的 Firefox 帐户登录的设备之间同步容器(例如:同步容器的名字以及网站的工作)</li> <li>避免社交网络的历史记录(例如:在社交网络上使用容器)<br> 关于 Firefox Container 的更多信息可以访问 <a class="link" href="https://support.mozilla.org/1/firefox/117.0/Darwin/en-US/containers" target="_blank" rel="external nofollow noopener noreferrer" >https://support.mozilla.org/1/firefox/117.0/Darwin/en-US/containers</a> 了解。</li> </ol> <h4 id="panels">Panels </h4><p>Panels 可以把标签分为不同的分区,不同的 Panel 可以配置不同的样式与绑定不同的 Container ,可以根据自己的使用习惯配置 Panels 。</p> <h4 id="navigation-bar">Navigation bar </h4><p>默认情况下导航条是在顶部的,如果你创建的 Panels 比较多,那么顶部的长度可能无法显示全部的 Panels ,使用上不太方便。<br> 所以我们可以把导航条放置在左侧垂直显示,这样可以显示更多的 Panels 方便操作。</p> <ol> <li>首先把 <code>Navigation bar &gt; Layout</code> 选项设置为 <code>vertical</code> 。</li> <li>在 <code>Styles editor</code> 中填写下面的 CSS 代码,美化显示效果。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">root</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nv">--nav-btn-width</span><span class="p">:</span> <span class="mi">22</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="nv">--name-font-size</span><span class="p">:</span> <span class="mi">12</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="nv">--count-font-size</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">column-reverse</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">padding</span><span class="p">:</span> <span class="mi">6</span><span class="kt">px</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panels-box</span> <span class="p">.</span><span class="nc">panel-btn</span><span class="o">[</span><span class="nt">data-type</span><span class="o">=</span><span class="s2">&#34;add&#34;</span><span class="o">]</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">nav</span><span class="o">-</span><span class="n">btn</span><span class="o">-</span><span class="n">width</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panels-box</span> <span class="p">.</span><span class="nc">panel-btn</span><span class="p">:</span><span class="nd">not</span><span class="o">([</span><span class="nt">data-type</span><span class="o">=</span><span class="s2">&#34;add&#34;</span><span class="o">])</span> <span class="o">&gt;</span> <span class="nt">svg</span><span class="o">,</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panels-box</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="o">&gt;</span> <span class="nt">img</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">update-badge</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">top</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">left</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">ok-badge</span><span class="o">,</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">err-badge</span><span class="o">,</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">progress-spinner</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">len</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">font-size</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">count</span><span class="o">-</span><span class="n">font</span><span class="o">-</span><span class="n">size</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">writing-mode</span><span class="p">:</span> <span class="kc">sideways</span><span class="o">-</span><span class="n">lr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">text-orientation</span><span class="p">:</span> <span class="kc">mixed</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">background-color</span><span class="p">:</span> <span class="kc">transparent</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">margin</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">2</span><span class="kt">px</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">right</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="kc">container</span><span class="o">-</span><span class="n">fg</span><span class="p">,</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">nav</span><span class="o">-</span><span class="n">btn</span><span class="o">-</span><span class="n">fg</span><span class="p">));</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">len</span><span class="p">:</span><span class="nd">before</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">content</span><span class="p">:</span> <span class="s2">&#34;: &#34;</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">font-size</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">name</span><span class="o">-</span><span class="n">font</span><span class="o">-</span><span class="n">size</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">NavigationBar</span> <span class="p">.</span><span class="nc">panel-btn</span> <span class="p">.</span><span class="nc">name</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">position</span><span class="p">:</span> <span class="kc">relative</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">block</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">padding</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">padding-top</span><span class="p">:</span> <span class="mi">1</span><span class="kt">rem</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">margin</span><span class="p">:</span> <span class="mi">0</span> <span class="mi">2</span><span class="kt">px</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">font-size</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">name</span><span class="o">-</span><span class="n">font</span><span class="o">-</span><span class="n">size</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="k">color</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="kc">container</span><span class="o">-</span><span class="n">fg</span><span class="p">,</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">nav</span><span class="o">-</span><span class="n">btn</span><span class="o">-</span><span class="n">fg</span><span class="p">));</span> </span></span><span class="line"><span class="cl"> <span class="k">writing-mode</span><span class="p">:</span> <span class="kc">sideways</span><span class="o">-</span><span class="n">lr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">text-orientation</span><span class="p">:</span> <span class="kc">mixed</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">Tab</span><span class="o">[</span><span class="nt">data-active</span><span class="o">]</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">background-color</span><span class="p">:</span> <span class="mh">#FFF</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">box-shadow</span><span class="p">:</span> <span class="mi">0</span> <span class="mf">0.2</span><span class="kt">rem</span> <span class="mf">0.6</span><span class="kt">rem</span> <span class="nb">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">.2</span><span class="p">);</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="效果-1">效果 </h3><p><img src="https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/firefox_sidebery.png" width="2168" height="1398" srcset="https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/firefox_sidebery_hu_7b1e18b45c9fd0f0.png 480w, https://mingming.wang/posts/configure-vertical-tabs-and-auto-tab-discard-for-firefox/firefox_sidebery_hu_16a635200d8e3b02.png 1024w" loading="lazy" alt="Sidebery 效果图" class="gallery-image" data-flex-grow="155" data-flex-basis="372px" ></p> <h3 id="其它">其它 </h3><p>关于 Sidebery 的更多使用方法可以参考 <a class="link" href="https://github.com/mbnuqw/sidebery/wiki" target="_blank" rel="external nofollow noopener noreferrer" >Sidebery Wiki</a> </p> <h2 id="参考资料">参考资料 </h2><ul> <li><a class="link" href="https://github.com/mbnuqw/sidebery/wiki" target="_blank" rel="external nofollow noopener noreferrer" >Sidebery Wiki</a> </li> <li><a class="link" href="https://support.mozilla.org/1/firefox/117.0/Darwin/en-US/containers" target="_blank" rel="external nofollow noopener noreferrer" >Firefox Containers</a> </li> </ul> 使用GPG对Git commit/tag进行签名 https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/ Wed, 10 May 2023 20:15:31 +0800 https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/ <h2 id="演示环境">演示环境 </h2><ul> <li>系统:MacOS、Ubuntu</li> <li>Git版本:2.40.0</li> <li>IDE:Goland 2023.3.3</li> </ul> <h2 id="为什么要签名">为什么要签名 </h2><p>GPG 可以对 Git commit 或 tag 进行签名,其它用户可以知道这个commit来源可信,也就是作者本人提交的代码。</p> <h2 id="macos系统">MacOS系统 </h2><p>到 GPG Tools 官网( <a class="link" href="https://gpgtools.org/" target="_blank" rel="external nofollow noopener noreferrer" >https://gpgtools.org/</a> )下载并安装 GPG Suite 工具,安装过程比较简单就不再赘述了。</p> <p>然后执行 <code>gpgconf</code>应该会得到类似如下的配置信息。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gpg:OpenPGP:/usr/local/MacGPG2/bin/gpg </span></span><span class="line"><span class="cl">gpgsm:S/MIME:/usr/local/MacGPG2/bin/gpgsm </span></span><span class="line"><span class="cl">gpg-agent:私钥:/usr/local/MacGPG2/bin/gpg-agent </span></span><span class="line"><span class="cl">scdaemon:智能卡:/usr/local/MacGPG2/libexec/scdaemon </span></span><span class="line"><span class="cl">dirmngr:网络:/usr/local/MacGPG2/bin/dirmngr </span></span><span class="line"><span class="cl">pinentry:密码条目:/usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac </span></span></code></pre></td></tr></table> </div> </div><h2 id="ubuntu系统">Ubuntu系统 </h2><p>执行如下命令安装相关命令行软件。<br> <code>sudo apt -y install gnupg2 gnupg-agent pinentry-gnome3</code></p> <p>然后执行 <code>gpgconf</code>应该会得到类似如下的配置信息。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gpg:OpenPGP:/usr/bin/gpg </span></span><span class="line"><span class="cl">gpg-agent:私钥:/usr/bin/gpg-agent </span></span><span class="line"><span class="cl">scdaemon:智能卡:/usr/lib/gnupg/scdaemon </span></span><span class="line"><span class="cl">gpgsm:S/MIME:/usr/bin/gpgsm </span></span><span class="line"><span class="cl">dirmngr:网络:/usr/bin/dirmngr </span></span><span class="line"><span class="cl">pinentry:密码条目:/usr/bin/pinentry </span></span></code></pre></td></tr></table> </div> </div><h2 id="生成-gpg-key">生成 GPG Key </h2><p>可以使用 GPG Keychain ( MacOS ) 或 CLI 命令生成 GPG Key ,根据自己的喜好选择其中一种生成方式。</p> <h3 id="使用-gpg-keychain-生成-key">使用 GPG Keychain 生成 Key </h3><ol> <li>打开安装好的 GPG Keychain 工具,在主界面点击创建按钮,然后填写信息,点击 Create Key 确认创建。这里用于演示,密码设置的比较简单,实际使用的时候不建议使用弱密码。</li> </ol> <p><img src="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/create_gpg_key.png" width="450" height="279" srcset="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/create_gpg_key_hu_3f226a2703e25f6d.png 480w, https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/create_gpg_key_hu_16ab370c3e2f9359.png 1024w" loading="lazy" alt="生成 GPG Key" class="gallery-image" data-flex-grow="161" data-flex-basis="387px" ></p> <ol start="2"> <li>完成创建后可在 GPG Keychain 主界面的列表中看到刚刚创建的Key。</li> </ol> <p><img src="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/key_list.png" width="1105" height="633" srcset="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/key_list_hu_efd42003843d312.png 480w, https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/key_list_hu_f774e4369bf75097.png 1024w" loading="lazy" alt="生成后的 GPG Key 列表" class="gallery-image" data-flex-grow="174" data-flex-basis="418px" ></p> <h3 id="使用-cli-生成-key">使用 CLI 生成 Key </h3><ol> <li>打开终端,执行命令 <code>gpg --full-generate-key</code> ,然后按引导完成信息填写。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gpg <span class="o">(</span>GnuPG/MacGPG2<span class="o">)</span> 2.2.41<span class="p">;</span> Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2022</span> g10 Code GmbH </span></span><span class="line"><span class="cl">This is free software: you are free to change and redistribute it. </span></span><span class="line"><span class="cl">There is NO WARRANTY, to the extent permitted by law. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">请选择您要使用的密钥类型: </span></span><span class="line"><span class="cl"> <span class="o">(</span>1<span class="o">)</span> RSA 和 RSA (默认) </span></span><span class="line"><span class="cl"> <span class="o">(</span>2<span class="o">)</span> DSA 和 Elgamal </span></span><span class="line"><span class="cl"> <span class="o">(</span>3<span class="o">)</span> DSA(仅用于签名) </span></span><span class="line"><span class="cl"> <span class="o">(</span>4<span class="o">)</span> RSA(仅用于签名) </span></span><span class="line"><span class="cl"> (14)卡中现有密钥 </span></span><span class="line"><span class="cl">您的选择是? </span></span><span class="line"><span class="cl">RSA 密钥的长度应在 <span class="m">1024</span> 位与 <span class="m">4096</span> 位之间。 </span></span><span class="line"><span class="cl">您想要使用的密钥长度?<span class="o">(</span>3072<span class="o">)</span> </span></span><span class="line"><span class="cl">请求的密钥长度是 <span class="m">3072</span> 位 </span></span><span class="line"><span class="cl">请设定这个密钥的有效期限。 </span></span><span class="line"><span class="cl"> <span class="nv">0</span> <span class="o">=</span> 密钥永不过期 </span></span><span class="line"><span class="cl"> &lt;n&gt; <span class="o">=</span> 密钥在 n 天后过期 </span></span><span class="line"><span class="cl"> &lt;n&gt;w <span class="o">=</span> 密钥在 n 周后过期 </span></span><span class="line"><span class="cl"> &lt;n&gt;m <span class="o">=</span> 密钥在 n 月后过期 </span></span><span class="line"><span class="cl"> &lt;n&gt;y <span class="o">=</span> 密钥在 n 年后过期 </span></span><span class="line"><span class="cl">密钥的有效期限是?<span class="o">(</span>0<span class="o">)</span> </span></span><span class="line"><span class="cl">密钥永远不会过期 </span></span><span class="line"><span class="cl">这些内容正确吗? <span class="o">(</span>y/N<span class="o">)</span> y </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">GnuPG 需要构建用户标识以辨认您的密钥。 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">真实姓名: mingming.wang </span></span><span class="line"><span class="cl">电子邮件地址: [email protected] </span></span><span class="line"><span class="cl">注释: </span></span><span class="line"><span class="cl">您选定了此用户标识: </span></span><span class="line"><span class="cl"> “mingming.wang &lt;[email protected]&gt;” </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o </span></span><span class="line"><span class="cl">我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘 </span></span><span class="line"><span class="cl">、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数 </span></span><span class="line"><span class="cl">发生器有更好的机会获得足够的熵。 </span></span><span class="line"><span class="cl">我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘 </span></span><span class="line"><span class="cl">、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数 </span></span><span class="line"><span class="cl">发生器有更好的机会获得足够的熵。 </span></span><span class="line"><span class="cl">gpg: 吊销证书已被存储为‘/Users/user/.gnupg/openpgp-revocs.d/D913D0FA1E6CBCE92E2778A3956777BF98727EF3.rev’ </span></span><span class="line"><span class="cl">公钥和私钥已经生成并被签名。 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">pub rsa3072 2023-05-10 <span class="o">[</span>SC<span class="o">]</span> </span></span><span class="line"><span class="cl"> D913D0FA1E6CBCE92E2778A3956777BF98727EF3 </span></span><span class="line"><span class="cl">uid mingming.wang &lt;[email protected]&gt; </span></span><span class="line"><span class="cl">sub rsa3072 2023-05-10 <span class="o">[</span>E<span class="o">]</span> </span></span></code></pre></td></tr></table> </div> </div><ol start="2"> <li>执行 <code>gpg --list-keys --keyid-format=long</code> 查看刚刚创建的Key是否在列表中。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">/Users/ming/.gnupg/pubring.kbx </span></span><span class="line"><span class="cl">------------------------------ </span></span><span class="line"><span class="cl">pub dsa2048/76D78F0500D026C4 2010-08-19 <span class="o">[</span>SC<span class="o">]</span> <span class="o">[</span>有效至:2024-05-11<span class="o">]</span> </span></span><span class="line"><span class="cl"> 85E38F69046B44C1EC9FB07B76D78F0500D026C4 </span></span><span class="line"><span class="cl">uid <span class="o">[</span> 未知 <span class="o">]</span> GPGTools Team &lt;[email protected]&gt; </span></span><span class="line"><span class="cl">uid <span class="o">[</span> 未知 <span class="o">]</span> <span class="o">[</span>jpeg image of size 6329<span class="o">]</span> </span></span><span class="line"><span class="cl">sub rsa4096/E8A664480D9E43F5 2014-04-08 <span class="o">[</span>S<span class="o">]</span> <span class="o">[</span>有效至:2024-05-11<span class="o">]</span> </span></span><span class="line"><span class="cl">sub rsa4096/E73107F9EF97597C 2020-05-11 <span class="o">[</span>E<span class="o">]</span> <span class="o">[</span>有效至:2024-05-11<span class="o">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">pub rsa4096/8A9E3745558E41AF 2020-05-04 <span class="o">[</span>SC<span class="o">]</span> <span class="o">[</span>有效至:2024-05-03<span class="o">]</span> </span></span><span class="line"><span class="cl"> B97E9964ACAD1907970D37CC8A9E3745558E41AF </span></span><span class="line"><span class="cl">uid <span class="o">[</span> 未知 <span class="o">]</span> GPGTools Support &lt;[email protected]&gt; </span></span><span class="line"><span class="cl">sub rsa4096/B35D2E404496652B 2020-05-04 <span class="o">[</span>E<span class="o">]</span> <span class="o">[</span>有效至:2024-05-03<span class="o">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">pub rsa3072/956777BF98727EF3 2023-05-10 <span class="o">[</span>SC<span class="o">]</span> </span></span><span class="line"><span class="cl"> D913D0FA1E6CBCE92E2778A3956777BF98727EF3 </span></span><span class="line"><span class="cl">uid <span class="o">[</span> 绝对 <span class="o">]</span> mingming.wang &lt;[email protected]&gt; </span></span><span class="line"><span class="cl">sub rsa3072/1F969992B93D1EA3 2023-05-10 <span class="o">[</span>E<span class="o">]</span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="为github-账号配置-gpg-key">为GitHub 账号配置 GPG Key </h2><ol> <li>执行 <code>gpg --armor --export 956777BF98727EF3</code> 查询 GPG Public Key信息,复制所有Public Key 的内容,包含 <code>-----BEGIN PGP PUBLIC KEY BLOCK-----</code> 和 <code>-----END PGP PUBLIC KEY BLOCK-----</code></li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">-----BEGIN PGP PUBLIC KEY BLOCK----- </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">mQGNBGRbT0YBDADJLoFcxkpKqQKLoi6/Xx32sWj5Hl9+BbL2UhS+7YeVaG+dbRo8 </span></span><span class="line"><span class="cl">... 中间部分省略 ... </span></span><span class="line"><span class="cl">esmBsc0uYInNCxM+qLT3uXc= </span></span><span class="line"><span class="cl">=LJum </span></span><span class="line"><span class="cl">-----END PGP PUBLIC KEY BLOCK----- </span></span></code></pre></td></tr></table> </div> </div><ol start="2"> <li>进入 Github 的 GPG 设置页面,Settings / SSH and GPG Keys ,点击 <code>New GPG Key</code> 按钮。</li> <li>填写第一步获取的 GPG Public Key 信息,并点击 <code>Add GPG Key</code> 按钮</li> </ol> <h2 id="签名-commit">签名 Commit </h2><h3 id="设置git">设置Git </h3><p>这里设置的 <code>/usr/local/MacGPG2/bin/gpg</code> 来源于上一步骤中,通过执行 <code>gpgconf</code> 可以查询到。<br> 如果只针对单个项目配置GPG签名,可以把下面命令中的 <code>--global</code> 参数去掉。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">git config --global gpg.program /usr/local/MacGPG2/bin/gpg </span></span><span class="line"><span class="cl">git config --global --unset gpg.format </span></span><span class="line"><span class="cl">git config --global commit.gpgsign <span class="nb">true</span> </span></span><span class="line"><span class="cl">git config --global user.signingkey 956777BF98727EF3 </span></span></code></pre></td></tr></table> </div> </div><h3 id="cli环境下签名">CLI环境下签名 </h3><p>在进行 <code>git commit</code> 时,添加 <code>-S</code> 参数,表示这个commit使用签名。<code>-S</code> 后可以指定 <code>&lt;keyid&gt;</code> 来使用不同的 GPG Key,如果未指定则使用默认的 Key Id 。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">git add . </span></span><span class="line"><span class="cl">git commit -S -m <span class="s2">&#34;Initial commit&#34;</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="goland环境下签名">Goland环境下签名 </h3><p>在 Goland 设置页面选择 Git Commit 所使用的 GPG Key,Settings / Version Control / Git / Commit / Configure GPG Key,然后正常进行 Git Commit 会自动进行签名。</p> <p><img src="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/select_gpg_key_in_goland.png" width="1482" height="1071" srcset="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/select_gpg_key_in_goland_hu_3eb8f8467eb8592a.png 480w, https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/select_gpg_key_in_goland_hu_da74e549a7de3ceb.png 1024w" loading="lazy" alt="Goland 配置" class="gallery-image" data-flex-grow="138" data-flex-basis="332px" ></p> <h2 id="在-github-页面验证效果">在 Github 页面验证效果 </h2><p><img src="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/gpg_test_commit.png" width="1245" height="592" srcset="https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/gpg_test_commit_hu_1947e8c5ea2b005f.png 480w, https://mingming.wang/posts/shi-yong-gpg-dui-git-committag-jin-xing-qian-ming/images/gpg_test_commit_hu_aaa40145fea2d57f.png 1024w" loading="lazy" alt="Github Commit" class="gallery-image" data-flex-grow="210" data-flex-basis="504px" ></p> <h2 id="备份与导入">备份与导入 </h2><p>为了在其它电脑或在重装系统后依然能使用之前的 GPG Key,你需要把生成的 GPG Key 进行备份,然后存储到一个安全的介质中(如:U盘、密码管理软件等),在需要的时候导入 GPG Key。</p> <h3 id="ui界面操作">UI界面操作 </h3><p>使用界面操作比较简单,只需要在 <code>GPG Keychain</code> 主界面,点击<code>导入</code>或<code>导出</code>按钮按引导操作即可。</p> <h3 id="cli备份">CLI备份 </h3><ol> <li>导出私钥,私钥包含公钥信息,所以如果备份了私钥,公钥就不需要导出备份了。</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">gpg</span> <span class="o">--</span><span class="k">export</span><span class="o">-</span><span class="n">secret</span><span class="o">-</span><span class="n">keys</span> <span class="o">--</span><span class="n">armor</span> <span class="mi">956777</span><span class="n">BF98727EF3</span> <span class="o">&gt;</span> <span class="n">gpg_private</span><span class="o">.</span><span class="n">key</span> </span></span></code></pre></td></tr></table> </div> </div><ol start="2"> <li>导出公钥</li> </ol> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">gpg</span> <span class="o">--</span><span class="k">export</span> <span class="o">--</span><span class="n">armor</span> <span class="mi">956777</span><span class="n">BF98727EF3</span> <span class="o">&gt;</span> <span class="n">gpg_public</span><span class="o">.</span><span class="n">key</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="cli导入">CLI导入 </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">gpg --import gpg_private.key </span></span></code></pre></td></tr></table> </div> </div><h2 id="参考资料">参考资料 </h2><ul> <li><a class="link" href="https://docs.github.com/en/authentication/managing-commit-signature-verification" target="_blank" rel="external nofollow noopener noreferrer" >Github Verify commit signatrues</a> </li> <li><a class="link" href="https://www.jetbrains.com/help/go/set-up-GPG-commit-signing.html" target="_blank" rel="external nofollow noopener noreferrer" >Goland Sign commits with GPG keys</a> </li> <li><a class="link" href="https://www.gnupg.org/documentation/manpage.html" target="_blank" rel="external nofollow noopener noreferrer" >GnuPG Manpage</a> </li> </ul> Deepin系统下基于Visual Studio Code的Unity开发环境配置 https://mingming.wang/posts/deepin-visual-studio-code-unity-huanjingpeizhi/ Wed, 07 Dec 2022 15:31:01 +0800 https://mingming.wang/posts/deepin-visual-studio-code-unity-huanjingpeizhi/ <h2 id="适用操作系统">适用操作系统 </h2><ul> <li>Deepin</li> <li>UOS</li> <li>Ubuntu</li> <li>Debian</li> </ul> <h2 id="unity安装">Unity安装 </h2><h3 id="1-通过官方网站下载unity-hub-deb安装文件">1. 通过官方网站下载Unity Hub .deb安装文件 </h3><p>下载地址: <a class="link" href="https://unity.cn/releases" target="_blank" rel="external nofollow noopener noreferrer" >https://unity.cn/releases</a> </p> <h3 id="2-通过添加unity-hub-repository使用apt包管理安装">2. 通过添加Unity Hub repository,使用APT包管理安装 </h3><p>参考地址:<a class="link" href="https://docs.unity3d.com/hub/manual/InstallHub.html" target="_blank" rel="external nofollow noopener noreferrer" >https://docs.unity3d.com/hub/manual/InstallHub.html</a> </p> <p>安装:依次执行以下命令</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo sh -c <span class="s1">&#39;echo &#34;deb https://hub.unity3d.com/linux/repos/deb stable main&#34; &gt; /etc/apt/sources.list.d/unityhub.list&#39;</span> </span></span><span class="line"><span class="cl">wget -qO - https://hub.unity3d.com/linux/keys/public <span class="p">|</span> sudo apt-key add - </span></span><span class="line"><span class="cl">sudo apt update </span></span><span class="line"><span class="cl">sudo apt-get install unityhub </span></span></code></pre></td></tr></table> </div> </div><p>卸载:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get remove unityhub </span></span></code></pre></td></tr></table> </div> </div><h2 id="visual-studio-code安装">Visual Studio Code安装 </h2><h3 id="1-visual-studio-code本体安装">1. Visual Studio Code本体安装 </h3><p>略</p> <h3 id="2-visual-studio-code插件安装">2. Visual Studio Code插件安装 </h3><ul> <li>C#</li> <li>C# XML Documentation Comments</li> <li>Debugger for Unity</li> <li>IntelliCode</li> <li>Todo Tree</li> </ul> <h2 id="net-core-sdk安装">.Net Core SDK安装 </h2><p>官方参考文档:<a class="link" href="https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-debian" target="_blank" rel="external nofollow noopener noreferrer" >https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-debian</a> </p> <h3 id="使用apt包管理安装">使用APT包管理安装 </h3><p>打开终端并运行以下命令:用于添加签名密钥</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb </span></span><span class="line"><span class="cl">sudo dpkg -i packages-microsoft-prod.deb </span></span><span class="line"><span class="cl">rm packages-microsoft-prod.deb </span></span></code></pre></td></tr></table> </div> </div><p>安装SDK:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update <span class="o">&amp;&amp;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> sudo apt-get install -y dotnet-sdk-6.0 </span></span></code></pre></td></tr></table> </div> </div><h3 id="使用snap安装">使用SNAP安装 </h3><p>打开终端执行如下命令:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo snap install dotnet-sdk --classic --channel<span class="o">=</span>7.0 </span></span><span class="line"><span class="cl">sudo snap <span class="nb">alias</span> dotnet-sdk.dotnet dotnet </span></span></code></pre></td></tr></table> </div> </div><p>配置环境变量 :</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">DOTNET_ROOT</span><span class="o">=</span>/snap/dotnet-sdk/current </span></span></code></pre></td></tr></table> </div> </div><p>以上命令只在执行的当前shell生效,将以上命令添加到系统shell的配置文件中使其永久生效,相关Shell的配置文件路径如下:</p> <ul> <li>Bash Shell:<del>/.bash_profile、</del>/.bashrc</li> <li>Korn Shell:~/.kshrc 或 .profile</li> <li>Z Shell:~/.zshrc 或 .zprofile</li> </ul> <h2 id="安装mono">安装Mono </h2><p>参考地址:<a class="link" href="https://www.mono-project.com/download/stable/#download-lin-debian" target="_blank" rel="external nofollow noopener noreferrer" >https://www.mono-project.com/download/stable/#download-lin-debian</a> </p> <p>打开终端执行如下命令:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt install apt-transport-https dirmngr gnupg ca-certificates </span></span><span class="line"><span class="cl">sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb https://download.mono-project.com/repo/debian stable-buster main&#34;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/mono-official-stable.list </span></span><span class="line"><span class="cl">sudo apt update </span></span><span class="line"><span class="cl">sudo apt install mono-devel </span></span></code></pre></td></tr></table> </div> </div><p>验证Mono是否安装成功,可参考文档:<a class="link" href="https://www.mono-project.com/docs/getting-started/mono-basics/" target="_blank" rel="external nofollow noopener noreferrer" >https://www.mono-project.com/docs/getting-started/mono-basics/</a> </p> <h2 id="配置omnisharp">配置OmniSharp </h2><ul> <li>打开Visual Studio Code的配置</li> <li>搜索 <code>Use Modern Net</code> ,取消勾选</li> </ul> <h2 id="为unity配置c代码编辑器">为Unity配置C#代码编辑器 </h2><p>在菜单栏 <code>Editor&gt;References</code> 的 <code>External Tool</code> 中,<code>external script editor</code> 选择 <code>Visual Studio Code</code>,如果没有<code>Visual Studio Code</code>选项,则选择Browser,到 <code>usr&gt;bin</code> 目录下选择<code>Visual Studio Code</code>的可选择文件。</p> <p>当 <code>external script editor args</code> 中出现了完整的参数列表,表示配置成功。</p> <h2 id="安装plastic-scm-cloud">安装Plastic scm Cloud </h2><p>参考文档:<a class="link" href="https://www.plasticscm.com/plastic-for-linux" target="_blank" rel="external nofollow noopener noreferrer" >https://www.plasticscm.com/plastic-for-linux</a> </p> <p>终端依次执⾏如下命令:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update </span></span><span class="line"><span class="cl">sudo apt-get install -y apt-transport-https </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb https://www.plasticscm.com/plasticrepo/stable/debian/ ./&#34;</span> <span class="p">|</span>  </span></span><span class="line"><span class="cl">sudo tee /etc/apt/sources.list.d/plasticscm-stable.list </span></span><span class="line"><span class="cl">wget https://www.plasticscm.com/plasticrepo/stable/debian/Release.key -O - <span class="p">|</span>  </span></span><span class="line"><span class="cl">sudo apt-key add - </span></span><span class="line"><span class="cl">sudo apt-get update </span></span><span class="line"><span class="cl">sudo apt-get install plasticscm-cloud </span></span></code></pre></td></tr></table> </div> </div><p>如果提示 有未满足的依赖关系:<br> 到 <code>/etc/apt/sources.list.d</code> ⽬录下新建名为:<code>bionic-oldlibs.list</code> 的⽂件,并在⽂件中添加如下两⾏命令(需要使⽤管理员身份打开⽬录才能创建⽂件):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted </span></span><span class="line"><span class="cl">deb http://us.archive.ubuntu.com/ubuntu/ bionic universe </span></span></code></pre></td></tr></table> </div> </div><p>然后终端执⾏:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 </span></span><span class="line"><span class="cl">sudo apt update </span></span></code></pre></td></tr></table> </div> </div><p>再次执⾏最开始命令:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo apt-get update </span></span><span class="line"><span class="cl">sudo apt-get install -y apt-transport-https </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb https://www.plasticscm.com/plasticrepo/stable/debian/ ./&#34;</span> <span class="p">|</span>  </span></span><span class="line"><span class="cl">sudo tee /etc/apt/sources.list.d/plasticscm-stable.list </span></span><span class="line"><span class="cl">wget https://www.plasticscm.com/plasticrepo/stable/debian/Release.key -O - <span class="p">|</span> sudo apt-key add - </span></span><span class="line"><span class="cl">sudo apt-get update </span></span><span class="line"><span class="cl">sudo apt-get install plasticscm-cloud </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》课程设计1 https://mingming.wang/posts/hui-bian-yu-yan-ke-cheng-she-ji-1/ Sat, 18 Sep 2021 15:42:23 +0800 https://mingming.wang/posts/hui-bian-yu-yan-ke-cheng-she-ji-1/ <h2 id="任务">任务 </h2><p>将实验7中的Power idea公司的数据按照图10.2所示的格式在屏幕上显示出来。<br> <img src="https://mingming.wang/posts/hui-bian-yu-yan-ke-cheng-she-ji-1/images/power_idea_table.jpg" width="389" height="358" srcset="https://mingming.wang/posts/hui-bian-yu-yan-ke-cheng-she-ji-1/images/power_idea_table_hu_d63ae0b41187d5b4.jpg 480w, https://mingming.wang/posts/hui-bian-yu-yan-ke-cheng-she-ji-1/images/power_idea_table_hu_f9079df60a6c64f.jpg 1024w" loading="lazy" alt="Power Idea 数据表" class="gallery-image" data-flex-grow="108" data-flex-basis="260px" ></p> <h2 id="答">答 </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt"> 10 </span><span class="lnt"> 11 </span><span class="lnt"> 12 </span><span class="lnt"> 13 </span><span class="lnt"> 14 </span><span class="lnt"> 15 </span><span class="lnt"> 16 </span><span class="lnt"> 17 </span><span class="lnt"> 18 </span><span class="lnt"> 19 </span><span class="lnt"> 20 </span><span class="lnt"> 21 </span><span class="lnt"> 22 </span><span class="lnt"> 23 </span><span class="lnt"> 24 </span><span class="lnt"> 25 </span><span class="lnt"> 26 </span><span class="lnt"> 27 </span><span class="lnt"> 28 </span><span class="lnt"> 29 </span><span class="lnt"> 30 </span><span class="lnt"> 31 </span><span class="lnt"> 32 </span><span class="lnt"> 33 </span><span class="lnt"> 34 </span><span class="lnt"> 35 </span><span class="lnt"> 36 </span><span class="lnt"> 37 </span><span class="lnt"> 38 </span><span class="lnt"> 39 </span><span class="lnt"> 40 </span><span class="lnt"> 41 </span><span class="lnt"> 42 </span><span class="lnt"> 43 </span><span class="lnt"> 44 </span><span class="lnt"> 45 </span><span class="lnt"> 46 </span><span class="lnt"> 47 </span><span class="lnt"> 48 </span><span class="lnt"> 49 </span><span class="lnt"> 50 </span><span class="lnt"> 51 </span><span class="lnt"> 52 </span><span class="lnt"> 53 </span><span class="lnt"> 54 </span><span class="lnt"> 55 </span><span class="lnt"> 56 </span><span class="lnt"> 57 </span><span class="lnt"> 58 </span><span class="lnt"> 59 </span><span class="lnt"> 60 </span><span class="lnt"> 61 </span><span class="lnt"> 62 </span><span class="lnt"> 63 </span><span class="lnt"> 64 </span><span class="lnt"> 65 </span><span class="lnt"> 66 </span><span class="lnt"> 67 </span><span class="lnt"> 68 </span><span class="lnt"> 69 </span><span class="lnt"> 70 </span><span class="lnt"> 71 </span><span class="lnt"> 72 </span><span class="lnt"> 73 </span><span class="lnt"> 74 </span><span class="lnt"> 75 </span><span class="lnt"> 76 </span><span class="lnt"> 77 </span><span class="lnt"> 78 </span><span class="lnt"> 79 </span><span class="lnt"> 80 </span><span class="lnt"> 81 </span><span class="lnt"> 82 </span><span class="lnt"> 83 </span><span class="lnt"> 84 </span><span class="lnt"> 85 </span><span class="lnt"> 86 </span><span class="lnt"> 87 </span><span class="lnt"> 88 </span><span class="lnt"> 89 </span><span class="lnt"> 90 </span><span class="lnt"> 91 </span><span class="lnt"> 92 </span><span class="lnt"> 93 </span><span class="lnt"> 94 </span><span class="lnt"> 95 </span><span class="lnt"> 96 </span><span class="lnt"> 97 </span><span class="lnt"> 98 </span><span class="lnt"> 99 </span><span class="lnt">100 </span><span class="lnt">101 </span><span class="lnt">102 </span><span class="lnt">103 </span><span class="lnt">104 </span><span class="lnt">105 </span><span class="lnt">106 </span><span class="lnt">107 </span><span class="lnt">108 </span><span class="lnt">109 </span><span class="lnt">110 </span><span class="lnt">111 </span><span class="lnt">112 </span><span class="lnt">113 </span><span class="lnt">114 </span><span class="lnt">115 </span><span class="lnt">116 </span><span class="lnt">117 </span><span class="lnt">118 </span><span class="lnt">119 </span><span class="lnt">120 </span><span class="lnt">121 </span><span class="lnt">122 </span><span class="lnt">123 </span><span class="lnt">124 </span><span class="lnt">125 </span><span class="lnt">126 </span><span class="lnt">127 </span><span class="lnt">128 </span><span class="lnt">129 </span><span class="lnt">130 </span><span class="lnt">131 </span><span class="lnt">132 </span><span class="lnt">133 </span><span class="lnt">134 </span><span class="lnt">135 </span><span class="lnt">136 </span><span class="lnt">137 </span><span class="lnt">138 </span><span class="lnt">139 </span><span class="lnt">140 </span><span class="lnt">141 </span><span class="lnt">142 </span><span class="lnt">143 </span><span class="lnt">144 </span><span class="lnt">145 </span><span class="lnt">146 </span><span class="lnt">147 </span><span class="lnt">148 </span><span class="lnt">149 </span><span class="lnt">150 </span><span class="lnt">151 </span><span class="lnt">152 </span><span class="lnt">153 </span><span class="lnt">154 </span><span class="lnt">155 </span><span class="lnt">156 </span><span class="lnt">157 </span><span class="lnt">158 </span><span class="lnt">159 </span><span class="lnt">160 </span><span class="lnt">161 </span><span class="lnt">162 </span><span class="lnt">163 </span><span class="lnt">164 </span><span class="lnt">165 </span><span class="lnt">166 </span><span class="lnt">167 </span><span class="lnt">168 </span><span class="lnt">169 </span><span class="lnt">170 </span><span class="lnt">171 </span><span class="lnt">172 </span><span class="lnt">173 </span><span class="lnt">174 </span><span class="lnt">175 </span><span class="lnt">176 </span><span class="lnt">177 </span><span class="lnt">178 </span><span class="lnt">179 </span><span class="lnt">180 </span><span class="lnt">181 </span><span class="lnt">182 </span><span class="lnt">183 </span><span class="lnt">184 </span><span class="lnt">185 </span><span class="lnt">186 </span><span class="lnt">187 </span><span class="lnt">188 </span><span class="lnt">189 </span><span class="lnt">190 </span><span class="lnt">191 </span><span class="lnt">192 </span><span class="lnt">193 </span><span class="lnt">194 </span><span class="lnt">195 </span><span class="lnt">196 </span><span class="lnt">197 </span><span class="lnt">198 </span><span class="lnt">199 </span><span class="lnt">200 </span><span class="lnt">201 </span><span class="lnt">202 </span><span class="lnt">203 </span><span class="lnt">204 </span><span class="lnt">205 </span><span class="lnt">206 </span><span class="lnt">207 </span><span class="lnt">208 </span><span class="lnt">209 </span><span class="lnt">210 </span><span class="lnt">211 </span><span class="lnt">212 </span><span class="lnt">213 </span><span class="lnt">214 </span><span class="lnt">215 </span><span class="lnt">216 </span><span class="lnt">217 </span><span class="lnt">218 </span><span class="lnt">219 </span><span class="lnt">220 </span><span class="lnt">221 </span><span class="lnt">222 </span><span class="lnt">223 </span><span class="lnt">224 </span><span class="lnt">225 </span><span class="lnt">226 </span><span class="lnt">227 </span><span class="lnt">228 </span><span class="lnt">229 </span><span class="lnt">230 </span><span class="lnt">231 </span><span class="lnt">232 </span><span class="lnt">233 </span><span class="lnt">234 </span><span class="lnt">235 </span><span class="lnt">236 </span><span class="lnt">237 </span><span class="lnt">238 </span><span class="lnt">239 </span><span class="lnt">240 </span><span class="lnt">241 </span><span class="lnt">242 </span><span class="lnt">243 </span><span class="lnt">244 </span><span class="lnt">245 </span><span class="lnt">246 </span><span class="lnt">247 </span><span class="lnt">248 </span><span class="lnt">249 </span><span class="lnt">250 </span><span class="lnt">251 </span><span class="lnt">252 </span><span class="lnt">253 </span><span class="lnt">254 </span><span class="lnt">255 </span><span class="lnt">256 </span><span class="lnt">257 </span><span class="lnt">258 </span><span class="lnt">259 </span><span class="lnt">260 </span><span class="lnt">261 </span><span class="lnt">262 </span><span class="lnt">263 </span><span class="lnt">264 </span><span class="lnt">265 </span><span class="lnt">266 </span><span class="lnt">267 </span><span class="lnt">268 </span><span class="lnt">269 </span><span class="lnt">270 </span><span class="lnt">271 </span><span class="lnt">272 </span><span class="lnt">273 </span><span class="lnt">274 </span><span class="lnt">275 </span><span class="lnt">276 </span><span class="lnt">277 </span><span class="lnt">278 </span><span class="lnt">279 </span><span class="lnt">280 </span><span class="lnt">281 </span><span class="lnt">282 </span><span class="lnt">283 </span><span class="lnt">284 </span><span class="lnt">285 </span><span class="lnt">286 </span><span class="lnt">287 </span><span class="lnt">288 </span><span class="lnt">289 </span><span class="lnt">290 </span><span class="lnt">291 </span><span class="lnt">292 </span><span class="lnt">293 </span><span class="lnt">294 </span><span class="lnt">295 </span><span class="lnt">296 </span><span class="lnt">297 </span><span class="lnt">298 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1975&#39;</span><span class="p">,</span><span class="s">&#39;1976&#39;</span><span class="p">,</span><span class="s">&#39;1977&#39;</span><span class="p">,</span><span class="s">&#39;1978&#39;</span><span class="p">,</span><span class="s">&#39;1979&#39;</span><span class="p">,</span><span class="s">&#39;1980&#39;</span><span class="p">,</span><span class="s">&#39;1981&#39;</span><span class="p">,</span><span class="s">&#39;1982&#39;</span><span class="p">,</span><span class="s">&#39;1983&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1984&#39;</span><span class="p">,</span><span class="s">&#39;1985&#39;</span><span class="p">,</span><span class="s">&#39;1986&#39;</span><span class="p">,</span><span class="s">&#39;1987&#39;</span><span class="p">,</span><span class="s">&#39;1988&#39;</span><span class="p">,</span><span class="s">&#39;1989&#39;</span><span class="p">,</span><span class="s">&#39;1990&#39;</span><span class="p">,</span><span class="s">&#39;1991&#39;</span><span class="p">,</span><span class="s">&#39;1992&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1993&#39;</span><span class="p">,</span><span class="s">&#39;1994&#39;</span><span class="p">,</span><span class="s">&#39;1995&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">16</span><span class="p">,</span><span class="mi">22</span><span class="p">,</span><span class="mi">382</span><span class="p">,</span><span class="mi">1356</span><span class="p">,</span><span class="mi">2390</span><span class="p">,</span><span class="mi">8000</span><span class="p">,</span><span class="mi">16000</span><span class="p">,</span><span class="mi">24486</span><span class="p">,</span><span class="mi">50065</span><span class="p">,</span><span class="mi">97479</span><span class="p">,</span><span class="mi">140417</span><span class="p">,</span><span class="mi">197514</span> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">345980</span><span class="p">,</span><span class="mi">590827</span><span class="p">,</span><span class="mi">803530</span><span class="p">,</span><span class="mi">1183000</span><span class="p">,</span><span class="mi">1843000</span><span class="p">,</span><span class="mi">2759000</span><span class="p">,</span><span class="mi">3753000</span><span class="p">,</span><span class="mi">4649000</span><span class="p">,</span><span class="mi">5937000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">3</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mi">13</span><span class="p">,</span><span class="mi">28</span><span class="p">,</span><span class="mi">38</span><span class="p">,</span><span class="mi">130</span><span class="p">,</span><span class="mi">220</span><span class="p">,</span><span class="mi">476</span><span class="p">,</span><span class="mi">778</span><span class="p">,</span><span class="mi">1001</span><span class="p">,</span><span class="mi">1442</span><span class="p">,</span><span class="mi">2258</span><span class="p">,</span><span class="mi">2793</span><span class="p">,</span><span class="mi">4037</span><span class="p">,</span><span class="mi">5635</span><span class="p">,</span><span class="mi">8226</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">11542</span><span class="p">,</span><span class="mi">14430</span><span class="p">,</span><span class="mi">25257</span><span class="p">,</span><span class="mi">17800</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data_str</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">16</span> <span class="nv">dup</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nf">data_str</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nb">cl</span><span class="nv">ear_screen</span> </span></span><span class="line"><span class="cl"><span class="nl">start_i:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dh</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">21</span> </span></span><span class="line"><span class="cl"> <span class="nl">print_row_start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">print_row</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">print_row_start</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">loop</span> <span class="nv">start_i</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">; 名称: print_row</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能: 打印一行记录</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数: (dh)=行号</span> </span></span><span class="line"><span class="cl"><span class="nl">print_row:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">si</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nv">data_str</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">print_row_year:</span> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算年份偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mi">4</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; ds:si 指向保存字符串的地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">si</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 把原数据复制到ds:si,一次操作2字</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">si</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="mi">2</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="mi">4</span><span class="p">],</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dl</span><span class="p">,</span><span class="mi">1</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">31</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">show_str</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">print_row_amount:</span> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算收入偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mi">4</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> <span class="c1">; ds:si 指向保存字符串的地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">si</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> <span class="c1">; 收入地址入栈,用于后面计算人均收入</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">84</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">84</span><span class="p">[</span><span class="nb">bx</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">dtoc</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dl</span><span class="p">,</span><span class="mi">11</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">31</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">show_str</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">print_row_count:</span> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算人员偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> <span class="c1">; ds:si 指向保存字符串的地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">si</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> <span class="c1">; 人员地址入栈,用于后面计算人均收入</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">168</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span> <span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">dtoc</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dl</span><span class="p">,</span><span class="mi">25</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">31</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">show_str</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">print_row_avg:</span> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算人均收入</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">168</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 人员数量</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">84</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 总收入</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span> <span class="nb">es</span><span class="p">:</span><span class="mi">84</span><span class="p">[</span><span class="nb">bx</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nb">di</span><span class="nv">vdw</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">dtoc</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dl</span><span class="p">,</span><span class="mi">35</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">31</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nv">show_str</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">si</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">; 名称: dtoc</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能: 将dword型数转变为表示十进制数的字符串,字符串以0为结尾符</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数: (ax)=dword型数据的低16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (dx)=dword型数据的高16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; ds:si指向字符串的首地址</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回: 无</span> </span></span><span class="line"><span class="cl"><span class="nl">dtoc:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> <span class="c1">; push进栈一个0值,用于在pop的时候判断是否已经到字符串尾部</span> </span></span><span class="line"><span class="cl"> <span class="nl">dtoc_div_start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">10</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nb">di</span><span class="nv">vdw</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">cx</span><span class="p">,</span><span class="mh">30H</span> <span class="c1">; cx是余数,入栈</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 判断商的dx和ax是否都为0,如果是则结束</span> </span></span><span class="line"><span class="cl"> <span class="nf">jcxz</span> <span class="nv">judge_ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_div_start</span> </span></span><span class="line"><span class="cl"> <span class="nl">judge_ax:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; 把ax放入cx,用于判断商为0时结束循环</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_div_start</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">dtoc_stack_to_data:</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bx</span><span class="p">],</span><span class="nb">dl</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 把dx放入cx,用于判断dx为0时结束循环</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_stack_to_data</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">; 名称:divdw</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数:(ax)=dword型数据的低16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (dx)=dword型数据的高16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cx)=除数</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回:(dx)=结果的高16位,(ax)=结果的低16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cx)=余数</span> </span></span><span class="line"><span class="cl"><span class="c1">; 公式:X/N = int(H/N)*65536 + (rem(H/N)*65536+L)/N</span> </span></span><span class="line"><span class="cl"><span class="nl">divdw:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> <span class="c1">; 把ax中的被除数低位暂存 L</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 把dx放入低ax位计算 H/N</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">div</span> <span class="nb">cx</span> <span class="c1">; H/N 商在AX,余数在DX</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; 暂存 H/N 商</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; mov dx, dx ; 因为 rem(H/N)*65536 = rem(H/N)*10000H 即左移4位,所以上次余数在DX中不用动</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> <span class="c1">; 取出被除数低位 L</span> </span></span><span class="line"><span class="cl"> <span class="nf">div</span> <span class="nb">cx</span> <span class="c1">; 商在AX,余数在DX</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; mov ax,ax ; 低位的商在ax中不变</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; dx中的余数传送到cx中</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="nb">bx</span> <span class="c1">; 高位计算的商传送到dx中</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"><span class="c1">; divdw</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">; 名称:show_str</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数:(dh)=行号(取值范围0~24), (dl)=列号(取值范围0~79),</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cl)=颜色,ds:si 指向字符串的首地址</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回:无</span> </span></span><span class="line"><span class="cl"><span class="nl">show_str:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算指定行号的偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="mi">160</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算列号偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dl</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 把列号偏移地址加到行号偏移地址中,保存在bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符串</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">di</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">si</span> </span></span><span class="line"><span class="cl"> <span class="nl">print_str:</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 把显存地址B800段地址放入ES段寄存器</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">0B800H</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="c1">; di作为显存地址的字符列偏移地址,每个字符占2字节</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">di</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 先把cl中的颜色保存到al中,因为后面会用到cx做为跳转判断字符串是否结束 </span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="nb">cl</span> </span></span><span class="line"><span class="cl"> <span class="nl">print_str_put:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ch</span><span class="p">,[</span><span class="nb">si</span><span class="p">]</span> <span class="c1">; 把字符串放入ch,并把cl置为0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">jcxz</span> <span class="nv">ok</span> <span class="c1">; 判断cx中的字符串是否为0,如果是说明字符串已结束,跳转到OK处</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="nb">di</span><span class="p">],</span><span class="nb">ch</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="nb">di</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="nb">al</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mi">1</span> <span class="c1">; si作为字符串偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">di</span><span class="p">,</span><span class="mi">2</span> <span class="c1">; di作为显存偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">print_str_put</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">ok:</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">si</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">di</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"><span class="c1">; show_str </span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nl">clear_screen:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">0b800h</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mh">0h</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">2000</span> </span></span><span class="line"><span class="cl"> <span class="nl">clear_screen_bx:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">word</span> <span class="nv">ptr</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="nb">si</span><span class="p">],</span><span class="mh">0h</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nb">cl</span><span class="nv">ear_screen_bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"><span class="c1">; clear_screen</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》实验10 编写子程序 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-10-bian-xie-zi-cheng-xu/ Sat, 18 Sep 2021 15:18:03 +0800 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-10-bian-xie-zi-cheng-xu/ <h2 id="1-显示字符串">1. 显示字符串 </h2><p>显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。</p> <h3 id="子程序描述">子程序描述 </h3><p>名称:show_str<br> 功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。<br> 参数:(dh)=行号(取值范围0 ~ 24),(dl)=列号(取值范围0 ~ 79),(cl)=颜色,ds:si指向字符串的首地址。<br> 返回:无</p> <h3 id="答">答 </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="c1">; 名称:show_str</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数:(dh)=行号(取值范围0~24), (dl)=列号(取值范围0~79),</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cl)=颜色,ds:si 指向字符串的首地址</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回:无</span> </span></span><span class="line"><span class="cl"><span class="nl">show_str:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算指定行号的偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="mi">160</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dh</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 计算列号偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mul</span> <span class="nb">dl</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 把列号偏移地址加到行号偏移地址中,保存在bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 打印字符串</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">di</span> </span></span><span class="line"><span class="cl"> <span class="nl">print_str:</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 把显存地址B800段地址放入ES段寄存器</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">0B800H</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="c1">; di作为显存地址的字符列偏移地址,每个字符占2字节</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">di</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 先把cl中的颜色保存到al中,因为后面会用到cx做为跳转判断字符串是否结束 </span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span><span class="nb">cl</span> </span></span><span class="line"><span class="cl"> <span class="nl">print_str_put:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ch</span><span class="p">,[</span><span class="nb">si</span><span class="p">]</span> <span class="c1">; 把字符串放入ch,并把cl置为0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cl</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">jcxz</span> <span class="nv">ok</span> <span class="c1">; 判断cx中的字符串是否为0,如果是说明字符串已结束,跳转到OK处</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="nb">di</span><span class="p">],</span><span class="nb">ch</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">][</span><span class="nb">di</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="nb">al</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mi">1</span> <span class="c1">; si作为字符串偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">di</span><span class="p">,</span><span class="mi">2</span> <span class="c1">; di作为显存偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">print_str_put</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">ok:</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">di</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">es</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"><span class="c1">; show_str </span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="2-解决除法溢出的问题">2. 解决除法溢出的问题 </h2><h3 id="问题">问题 </h3><p>前面读过,div指令可以做除法。当进行8位除法的时候,用al存储结果的商,ah存储结果的余数;进行16位除法的时候,用ax存储结果的商,dx存储结果的余数。可是,现在有一个问题,如果结果的商大于al或ax所能存储的最大值,那么将如何?</p> <h3 id="子程序描述-1">子程序描述 </h3><p>名称:divdw<br> 功能:进行不会产生溢出的除法去处,被除数为dword型,除数为word型,结果为dword型。<br> 参数:(ax)=dword型数据的低16位<br> (dx)=dword型数据的高16位<br> (cx)=除数<br> 返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数<br> 公式:X/N = int(H/N)*65535 + [rem(H/N)*65535+L]/N</p> <h3 id="答-1">答 </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="c1">; 名称:divdw</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数:(ax)=dword型数据的低16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (dx)=dword型数据的高16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cx)=除数</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回:(dx)=结果的高16位,(ax)=结果的低16位</span> </span></span><span class="line"><span class="cl"><span class="c1">; (cx)=余数</span> </span></span><span class="line"><span class="cl"><span class="c1">; 公式:X/N = int(H/N)*65536 + (rem(H/N)*65536+L)/N</span> </span></span><span class="line"><span class="cl"><span class="nl">divdw:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> <span class="c1">; 把ax中的被除数低位暂存 L</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 把dx放入低ax位计算 H/N</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">div</span> <span class="nb">cx</span> <span class="c1">; H/N 商在AX,余数在DX</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; 暂存 H/N 商</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; mov dx, dx ; 因为 rem(H/N)*65536 = rem(H/N)*10000H 即左移4位,所以上次余数在DX中不用动</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> <span class="c1">; 取出被除数低位 L</span> </span></span><span class="line"><span class="cl"> <span class="nf">div</span> <span class="nb">cx</span> <span class="c1">; 商在AX,余数在DX</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; mov ax,ax ; 低位的商在ax中不变</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; dx中的余数传送到cx中</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="nb">bx</span> <span class="c1">; 高位计算的商传送到dx中</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span><span class="line"><span class="cl"><span class="c1">; divdw</span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="3-数值显示">3. 数值显示 </h2><h3 id="问题-1">问题 </h3><p>编程,将data段中的数据以十进制的形式显示出来。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">123</span><span class="p">,</span><span class="mi">12666</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">38</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="子程序描述-2">子程序描述 </h3><p>名称:dtoc<br> 功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。<br> 参数:(ax)=word型数据 ,ds:si指向字符串的首地址<br> 返回:无</p> <h3 id="答-2">答 </h3><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="c1">; 名称:dtoc</span> </span></span><span class="line"><span class="cl"><span class="c1">; 功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。</span> </span></span><span class="line"><span class="cl"><span class="c1">; 参数:(ax)=word型数据 </span> </span></span><span class="line"><span class="cl"><span class="c1">; ds:si指向字符串的首地址</span> </span></span><span class="line"><span class="cl"><span class="c1">; 返回:无</span> </span></span><span class="line"><span class="cl"><span class="nl">dtoc:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">dx</span> <span class="c1">; push进栈一个0值,用于在pop的时候判断是否已经到字符串尾部</span> </span></span><span class="line"><span class="cl"> <span class="nl">dtoc_div_start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">10</span> </span></span><span class="line"><span class="cl"> <span class="nf">call</span> <span class="nb">di</span><span class="nv">vdw</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">cx</span><span class="p">,</span><span class="mh">30H</span> <span class="c1">; cx是余数,入栈</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 判断商的dx和ax是否都为0,如果是则结束</span> </span></span><span class="line"><span class="cl"> <span class="nf">jcxz</span> <span class="nv">judge_ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_div_start</span> </span></span><span class="line"><span class="cl"> <span class="nl">judge_ax:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; 把ax放入cx,用于判断商为0时结束循环</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_div_start</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nl">dtoc_stack_to_data:</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">ds</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bx</span><span class="p">],</span><span class="nb">dl</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="nb">dx</span> <span class="c1">; 把dx放入cx,用于判断dx为0时结束循环</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">dtoc_stack_to_data</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">ret</span> </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》实验9 根据材料编程 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-9-gen-ju-cai-liao-bian-cheng/ Sat, 18 Sep 2021 14:24:24 +0800 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-9-gen-ju-cai-liao-bian-cheng/ <h2 id="题目">题目 </h2><p>编程, 在屏幕蹭分别显示绿色、绿底红色、白底蓝色的字符串 &lsquo;welcome to masm!&rsquo;。</p> <h2 id="答">答 </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span><span class="lnt">67 </span><span class="lnt">68 </span><span class="lnt">69 </span><span class="lnt">70 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;welcome to masm!&#39;</span> <span class="c1">; 声明需要显示的文字内容</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">2</span><span class="p">,</span><span class="mi">36</span><span class="p">,</span><span class="mi">113</span> <span class="c1">; 声明3种颜色,如果需要打印更多颜色可以直接添加,并修改下面cx,3与这里的颜色数量相同</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">16</span> <span class="nv">dup</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1">; 声明16个字节的栈空间</span> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">0B800H</span> <span class="c1">; 0B800H~0BFFFHF共32K空间为80x25彩色字符显示缓冲区</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 遍历3种颜色,输出三行文字</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">di</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">3</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bp</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nl">s:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="mi">16</span><span class="p">[</span><span class="nb">di</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">cx</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 为了把字符打印到屏幕中央, 把前32字单元填充上空值,不显示内容</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">si</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">32</span> </span></span><span class="line"><span class="cl"> <span class="nl">s0:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">word</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bp</span><span class="p">],</span><span class="mh">0000H</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s0</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 从屏幕中间开始打印文字, 共16个字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">16</span> </span></span><span class="line"><span class="cl"> <span class="nl">s1:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">al</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 从ds段中取出需要的字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bp</span><span class="p">],</span><span class="nb">al</span> <span class="c1">; 向缓冲区输入字符</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bp</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span><span class="nb">ah</span> <span class="c1">; 向缓冲区输入颜色</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s1</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">; 屏幕后32字单元填充上00数据,清空后面的屏幕内容</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">32</span> </span></span><span class="line"><span class="cl"> <span class="nl">s2:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">word</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">][</span><span class="nb">bp</span><span class="p">],</span><span class="mh">0000H</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s2</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">cx</span> <span class="c1">; 恢复最外层的,颜色遍历计数</span> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">di</span> <span class="c1">; 颜色偏移位置加一个字节</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bp</span><span class="p">,</span><span class="mi">160</span> <span class="c1">; 屏幕行数加1 = 缓冲偏移地址+160个字节</span> </span></span><span class="line"><span class="cl"><span class="nf">loop</span> <span class="nv">s</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">; 保持程序不退出, 以方便查看输出的内容</span> </span></span><span class="line"><span class="cl"><span class="nl">sss:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">5</span> </span></span><span class="line"><span class="cl"><span class="nf">loop</span> <span class="nb">ss</span><span class="nv">s</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》实验8 分析一个奇怪的程序 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-8-fen-xi-yi-ge-qi-guai-de-cheng-xu/ Sat, 18 Sep 2021 14:08:11 +0800 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-8-fen-xi-yi-ge-qi-guai-de-cheng-xu/ <h2 id="任务">任务 </h2><p>分析下面的程序,在运行前思考:这个程序可以正确返回吗?<br> 运行后再思考:为什么是这种结果?<br> 通过这个程序加深对相关内容的理解。</p> <h2 id="答">答 </h2><p>可以正确返回,分析如下面代码中的注释</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">assume cs:code </span></span><span class="line"><span class="cl">code segment </span></span><span class="line"><span class="cl"> mov ax, 4c00h </span></span><span class="line"><span class="cl"> int 21h </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">start: </span></span><span class="line"><span class="cl"> mov ax,0 </span></span><span class="line"><span class="cl">s: </span></span><span class="line"><span class="cl"> nop ; 声明一个字节的空指令 </span></span><span class="line"><span class="cl"> nop ; 声明一个字节的空指令 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> mov di,offset s </span></span><span class="line"><span class="cl"> mov si,offset s2 </span></span><span class="line"><span class="cl"> mov ax,cs:[si] ; 把si指向的s2中的jmp short s1指令复制到di指向的s标识处 </span></span><span class="line"><span class="cl"> mov cs:[di],ax </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">s0: </span></span><span class="line"><span class="cl"> jmp short s ; 跳到s标识, 此时s标识处的指令为jmp short s1是复制到s处的指令,但因为是近转移,所以从s标识-8字节,会从code段第一条开始 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">s1: </span></span><span class="line"><span class="cl"> mov ax,0 </span></span><span class="line"><span class="cl"> int 21h </span></span><span class="line"><span class="cl"> mov ax,0 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">s2: </span></span><span class="line"><span class="cl"> jmp short s1 </span></span><span class="line"><span class="cl"> nop </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">code ends </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">end start </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》实验7 寻址方式在结构化数据访问中的应用 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-7-xun-zhi-fang-shi-zai-jie-gou-hua-shu-ju-fang-wen-zhong-de-ying-yong/ Fri, 17 Sep 2021 16:16:02 +0800 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-7-xun-zhi-fang-shi-zai-jie-gou-hua-shu-ju-fang-wen-zhong-de-ying-yong/ <h2 id="任务">任务 </h2><p>Power idea 公司从1975年成立一直到1995年的基本情况如下。</p> <table> <thead> <tr> <th>年份</th> <th>收入(千美元)</th> <th>雇员(人)</th> <th>人均收入(千美元)</th> </tr> </thead> <tbody> <tr> <td>1975</td> <td>16</td> <td>3</td> <td>?</td> </tr> <tr> <td>1975</td> <td>22</td> <td>7</td> <td>?</td> </tr> <tr> <td>1975</td> <td>382</td> <td>9</td> <td>?</td> </tr> <tr> <td>1975</td> <td>1356</td> <td>13</td> <td>?</td> </tr> <tr> <td>1975</td> <td>2390</td> <td>28</td> <td>?</td> </tr> <tr> <td>1975</td> <td>8000</td> <td>38</td> <td>?</td> </tr> <tr> <td>&hellip;</td> <td></td> <td></td> <td>?</td> </tr> <tr> <td>1995</td> <td>5937000</td> <td>17800</td> <td>?</td> </tr> </tbody> </table> <p>下面的程序中, 已经定义好了这些数据:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1975&#39;</span><span class="p">,</span><span class="s">&#39;1976&#39;</span><span class="p">,</span><span class="s">&#39;1977&#39;</span><span class="p">,</span><span class="s">&#39;1978&#39;</span><span class="p">,</span><span class="s">&#39;1979&#39;</span><span class="p">,</span><span class="s">&#39;1980&#39;</span><span class="p">,</span><span class="s">&#39;1981&#39;</span><span class="p">,</span><span class="s">&#39;1982&#39;</span><span class="p">,</span><span class="s">&#39;1983&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1984&#39;</span><span class="p">,</span><span class="s">&#39;1985&#39;</span><span class="p">,</span><span class="s">&#39;1986&#39;</span><span class="p">,</span><span class="s">&#39;1987&#39;</span><span class="p">,</span><span class="s">&#39;1988&#39;</span><span class="p">,</span><span class="s">&#39;1989&#39;</span><span class="p">,</span><span class="s">&#39;1990&#39;</span><span class="p">,</span><span class="s">&#39;1991&#39;</span><span class="p">,</span><span class="s">&#39;1992&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1993&#39;</span><span class="p">,</span><span class="s">&#39;1994&#39;</span><span class="p">,</span><span class="s">&#39;1995&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">16</span><span class="p">,</span><span class="mi">22</span><span class="p">,</span><span class="mi">382</span><span class="p">,</span><span class="mi">1356</span><span class="p">,</span><span class="mi">2390</span><span class="p">,</span><span class="mi">8000</span><span class="p">,</span><span class="mi">16000</span><span class="p">,</span><span class="mi">24486</span><span class="p">,</span><span class="mi">50065</span><span class="p">,</span><span class="mi">97479</span><span class="p">,</span><span class="mi">140417</span><span class="p">,</span><span class="mi">197514</span> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">345980</span><span class="p">,</span><span class="mi">590827</span><span class="p">,</span><span class="mi">803530</span><span class="p">,</span><span class="mi">1183000</span><span class="p">,</span><span class="mi">1843000</span><span class="p">,</span><span class="mi">2759000</span><span class="p">,</span><span class="mi">3753000</span><span class="p">,</span><span class="mi">4649000</span><span class="p">,</span><span class="mi">5937000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">3</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mi">13</span><span class="p">,</span><span class="mi">28</span><span class="p">,</span><span class="mi">38</span><span class="p">,</span><span class="mi">130</span><span class="p">,</span><span class="mi">220</span><span class="p">,</span><span class="mi">476</span><span class="p">,</span><span class="mi">778</span><span class="p">,</span><span class="mi">1001</span><span class="p">,</span><span class="mi">1442</span><span class="p">,</span><span class="mi">2258</span><span class="p">,</span><span class="mi">2793</span><span class="p">,</span><span class="mi">4037</span><span class="p">,</span><span class="mi">5635</span><span class="p">,</span><span class="mi">8226</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">11542</span><span class="p">,</span><span class="mi">14430</span><span class="p">,</span><span class="mi">25257</span><span class="p">,</span><span class="mi">17800</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">table</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">21</span> <span class="nv">dup</span> <span class="p">(</span><span class="s">&#39;year summ ne ?? &#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nf">table</span> <span class="nv">ends</span> </span></span></code></pre></td></tr></table> </div> </div><p>编程, 将data段中的数据按如下格式写入到table段中, 并计算21年中的人均收入(取整), 结果也按照下面的格式保存在table段中。<br> <img src="https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-7-xun-zhi-fang-shi-zai-jie-gou-hua-shu-ju-fang-wen-zhong-de-ying-yong/images/data_table.jpg" width="940" height="586" srcset="https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-7-xun-zhi-fang-shi-zai-jie-gou-hua-shu-ju-fang-wen-zhong-de-ying-yong/images/data_table_hu_d31f6443d34adbf.jpg 480w, https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-7-xun-zhi-fang-shi-zai-jie-gou-hua-shu-ju-fang-wen-zhong-de-ying-yong/images/data_table_hu_b8a7865edc0c5b6.jpg 1024w" loading="lazy" alt="“数据表”" class="gallery-image" data-flex-grow="160" data-flex-basis="384px" ></p> <h2 id="答">答 </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span><span class="lnt">44 </span><span class="lnt">45 </span><span class="lnt">46 </span><span class="lnt">47 </span><span class="lnt">48 </span><span class="lnt">49 </span><span class="lnt">50 </span><span class="lnt">51 </span><span class="lnt">52 </span><span class="lnt">53 </span><span class="lnt">54 </span><span class="lnt">55 </span><span class="lnt">56 </span><span class="lnt">57 </span><span class="lnt">58 </span><span class="lnt">59 </span><span class="lnt">60 </span><span class="lnt">61 </span><span class="lnt">62 </span><span class="lnt">63 </span><span class="lnt">64 </span><span class="lnt">65 </span><span class="lnt">66 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1975&#39;</span><span class="p">,</span><span class="s">&#39;1976&#39;</span><span class="p">,</span><span class="s">&#39;1977&#39;</span><span class="p">,</span><span class="s">&#39;1978&#39;</span><span class="p">,</span><span class="s">&#39;1979&#39;</span><span class="p">,</span><span class="s">&#39;1980&#39;</span><span class="p">,</span><span class="s">&#39;1981&#39;</span><span class="p">,</span><span class="s">&#39;1982&#39;</span><span class="p">,</span><span class="s">&#39;1983&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1984&#39;</span><span class="p">,</span><span class="s">&#39;1985&#39;</span><span class="p">,</span><span class="s">&#39;1986&#39;</span><span class="p">,</span><span class="s">&#39;1987&#39;</span><span class="p">,</span><span class="s">&#39;1988&#39;</span><span class="p">,</span><span class="s">&#39;1989&#39;</span><span class="p">,</span><span class="s">&#39;1990&#39;</span><span class="p">,</span><span class="s">&#39;1991&#39;</span><span class="p">,</span><span class="s">&#39;1992&#39;</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">&#39;1993&#39;</span><span class="p">,</span><span class="s">&#39;1994&#39;</span><span class="p">,</span><span class="s">&#39;1995&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">16</span><span class="p">,</span><span class="mi">22</span><span class="p">,</span><span class="mi">382</span><span class="p">,</span><span class="mi">1356</span><span class="p">,</span><span class="mi">2390</span><span class="p">,</span><span class="mi">8000</span><span class="p">,</span><span class="mi">16000</span><span class="p">,</span><span class="mi">24486</span><span class="p">,</span><span class="mi">50065</span><span class="p">,</span><span class="mi">97479</span><span class="p">,</span><span class="mi">140417</span><span class="p">,</span><span class="mi">197514</span> </span></span><span class="line"><span class="cl"> <span class="kd">dd</span> <span class="mi">345980</span><span class="p">,</span><span class="mi">590827</span><span class="p">,</span><span class="mi">803530</span><span class="p">,</span><span class="mi">1183000</span><span class="p">,</span><span class="mi">1843000</span><span class="p">,</span><span class="mi">2759000</span><span class="p">,</span><span class="mi">3753000</span><span class="p">,</span><span class="mi">4649000</span><span class="p">,</span><span class="mi">5937000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">3</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mi">13</span><span class="p">,</span><span class="mi">28</span><span class="p">,</span><span class="mi">38</span><span class="p">,</span><span class="mi">130</span><span class="p">,</span><span class="mi">220</span><span class="p">,</span><span class="mi">476</span><span class="p">,</span><span class="mi">778</span><span class="p">,</span><span class="mi">1001</span><span class="p">,</span><span class="mi">1442</span><span class="p">,</span><span class="mi">2258</span><span class="p">,</span><span class="mi">2793</span><span class="p">,</span><span class="mi">4037</span><span class="p">,</span><span class="mi">5635</span><span class="p">,</span><span class="mi">8226</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">11542</span><span class="p">,</span><span class="mi">14430</span><span class="p">,</span><span class="mi">25257</span><span class="p">,</span><span class="mi">17800</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">table</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">21</span> <span class="nv">dup</span> <span class="p">(</span><span class="s">&#39;year summ ne ?? &#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="nf">table</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">table</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">di</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">si</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">21</span> </span></span><span class="line"><span class="cl"><span class="nl">s:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span><span class="nv">.0</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 年份</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.0</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span><span class="nv">.2</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.2</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.4</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="s">&#39; &#39;</span> <span class="c1">; 空格</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">84</span><span class="p">]</span><span class="nv">.0</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 收入</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.5</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">84</span><span class="p">]</span><span class="nv">.2</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.5</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.5</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span><span class="s">&#39; &#39;</span> <span class="c1">; 空格</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="mi">168</span><span class="p">[</span><span class="nb">di</span><span class="p">]</span> <span class="c1">; 员工数量</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.0ah</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.0ah</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span><span class="s">&#39; &#39;</span> <span class="c1">; 空格</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">84</span><span class="p">]</span><span class="nv">.0</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 总收入低位放入ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dx</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="mi">84</span><span class="p">]</span><span class="nv">.2</span><span class="p">[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 总收入高位放入dx</span> </span></span><span class="line"><span class="cl"> <span class="nf">div</span> <span class="kt">word</span> <span class="nv">ptr</span> <span class="nb">ds</span><span class="p">:</span><span class="mi">168</span><span class="p">[</span><span class="nb">di</span><span class="p">]</span> <span class="c1">; 计算人均收入</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.0dh</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">ax</span> <span class="c1">; 商放入table中es:[si+D]字型单元</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="kt">byte</span> <span class="nv">ptr</span> <span class="nb">es</span><span class="p">:[</span><span class="nb">si</span><span class="p">]</span><span class="nv">.0fh</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="s">&#39; &#39;</span> <span class="c1">; 空格</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">4</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">di</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">si</span><span class="p">,</span><span class="mh">10h</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div> 《汇编语言》实验5 编写、调试具有多个段的程序 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-5-bian-xie-diao-shi-ju-you-duo-ge-duan-de-cheng-xu/ Thu, 16 Sep 2021 19:13:53 +0800 https://mingming.wang/posts/hui-bian-yu-yan-shi-yan-5-bian-xie-diao-shi-ju-you-duo-ge-duan-de-cheng-xu/ <h2 id="第-1-题">第 (1) 题 </h2><p>将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="nv">data</span><span class="p">,</span><span class="nb">ss</span><span class="p">:</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mh">0123h</span><span class="p">,</span><span class="mh">0456h</span><span class="p">,</span><span class="mh">0789h</span><span class="p">,</span><span class="mh">0abch</span><span class="p">,</span><span class="mh">0defh</span><span class="p">,</span><span class="mh">0fedh</span><span class="p">,</span><span class="mh">0cbah</span><span class="p">,</span><span class="mh">0987h</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ss</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">sp</span><span class="p">,</span><span class="mi">16</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="问题-">问题 ① </h3><p>CPU执行程序,程序返回前,data段中的数据 为多少?</p> <p><strong>答</strong><br> 保持不变。</p> <p><strong>分析</strong><br>    程序中先把栈顶指向了 stack段的空栈位置,即:<code>ss=stack sp=10H</code>。然后把ds指向数据data段,从<code>ds[0]</code>、<code>ds[2]</code> 两个字的数据 push到栈中,然后<code>pop[2]</code>、<code>[0]</code>把数据 从栈中取出,因为pop时偏移位置与push时调换了位置,所以传入到 data段中的数据还和原始一致。如还有疑问可参考3.6相关知识点。</p> <h3 id="问题--1">问题 ② </h3><p>CPU执行程序,程序返回前,cs=____ 、ss=<strong><strong>、ds=</strong></strong></p> <p><strong>答</strong><br> cs=<u>076E</u> 、ss=<u>076D</u>、ds=<u>076C</u></p> <p><strong>分析</strong><br> 不同计算机执行的时候这些数值会不一样,根据Debug的实际情况填写内容。</p> <h3 id="问题--2">问题 ③ </h3><p>设程序加载后,code段的段地址为X,则data段的段地址为____,stack段的段地址为____。</p> <p><strong>答</strong><br> data段的段地址为 X-2H,stack段的段地址为 X-1H。</p> <p><strong>分析</strong><br> 程序中段的位置依次为data、stack、code,data与stack声明的大小均为16Byte,则可以计算出stack段地址为 X-16Byte = X-1H,data段地址为 X-stack-16Byte = X-2H。</p> <h2 id="第-2-题">第 (2) 题 </h2><p>将下面的程序编译、链接,用Debug加载、跟踪,然后回答问题。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="nv">data</span><span class="p">,</span><span class="nb">ss</span><span class="p">:</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mh">0123H</span><span class="p">,</span><span class="mh">0456H</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ss</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">sp</span><span class="p">,</span><span class="mi">16</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="问题--3">问题 ① </h3><p>CPU执行程序,程序返回前,data段中的数据 为多少?</p> <p><strong>答</strong><br> 保持不变。</p> <p><strong>分析</strong><br> 与(1).① 相同</p> <h3 id="问题--4">问题 ② </h3><p>CPU执行程序,程序返回前,cs=____ 、ss=____ 、ds=____</p> <p><strong>答</strong><br> cs=<u>076E</u> 、ss=<u>076D</u>、ds=<u>076C</u></p> <p><strong>分析</strong><br> 与(1).② 相同</p> <h3 id="问题--5">问题 ③ </h3><p>设程序加载后,code段的段地址为X,则data段的段地址为____,stack段的段地址为____。</p> <p><strong>答</strong><br> data段的段地址为 X-2H,stack段的段地址为 X-1H。</p> <p><strong>分析</strong><br> 因为代码在data与stack段中的声明了2个字单元,但是因为每个段的必需是16的位数也就是说第个段的大小至少16Byte,所以与(1)中代码声明的data、stack所占用的空间大小是一样的都是16Byte,则相对于code段的偏移位置也是一样的。</p> <h3 id="问题--6">问题 ④ </h3><p>对于如下定义的段:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">name</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="err">…</span><span class="nf">.</span> </span></span><span class="line"><span class="cl"><span class="nf">name</span> <span class="nv">ends</span> </span></span></code></pre></td></tr></table> </div> </div><p>如果段中的数据占N个字节,则程序加载后,该段实际占用的空间为 ____ 。</p> <p><strong>答</strong><br> 该段实际占用的空间为 <u>ceil(N/16.0)*16Byte</u>。</p> <p><strong>分析</strong><br> 由于段地址必需是16倍数,所以实际占用空间为 <u>N除16 向上取整再乘以16Byte</u>。</p> <h2 id="第-3-题">第 (3) 题 </h2><p>将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span><span class="p">,</span><span class="nb">ds</span><span class="p">:</span><span class="nv">data</span><span class="p">,</span><span class="nb">ss</span><span class="p">:</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">stack</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ss</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">sp</span><span class="p">,</span><span class="mi">16</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">data</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">2</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span><span class="p">:[</span><span class="mi">0</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mh">0123H</span><span class="p">,</span><span class="mh">0456H</span> </span></span><span class="line"><span class="cl"><span class="nf">data</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">stack</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><h3 id="问题--7">问题 ① </h3><p>CPU执行程序,程序返回前,data段中的数据 为多少?</p> <p><strong>答</strong><br> 保持不变。</p> <h3 id="问题--8">问题 ② </h3><p>CPU执行程序,程序返回前,cs=____ 、ss=<strong><strong>、ds=</strong></strong> 。</p> <p><strong>答</strong><br> cs=<u>076C</u> 、ss=<u>0770</u>、ds=<u>076F</u> 。</p> <p><strong>分析</strong><br> 与(1).② 相同</p> <h3 id="问题--9">问题 ③ </h3><p>设程序加载后,code段的段地址为X,则data段的段地址为____,stack段的段地址为____ 。</p> <p><strong>答</strong><br> data段的段地址为 X+3H,stack段的段地址为 X+4 。</p> <p><strong>分析</strong><br> 用R命令可以看到CX=44H(程序的总长度),data与stack共占用20H长度,则code段的长度为44H-20H=24H,因为段地址必需按16Byte对齐则实际占用的空间为30H,所以data段为X+3H,stack段为X+4H</p> <h2 id="第-4-题">第 (4) 题 </h2><p>如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序 仍然可以正确执行?请说明原因。</p> <p><strong>答</strong><br> 都能执行,但只有程序(3)可以正确执行,因为程序 加载后会从程序第一个单元开始执行,但只有(3)中的code段在程序 的开始位置,所以所以只有(3)中的程序 是可以正确执行的。</p> <h2 id="第-5-题">第 (5) 题 </h2><p>程序如下,编写code段中的代码,将a段和b段 中的数据依次相加,将结果存到c段中。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">c</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">c</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">?</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><p><strong>答</strong></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span><span class="lnt">36 </span><span class="lnt">37 </span><span class="lnt">38 </span><span class="lnt">39 </span><span class="lnt">40 </span><span class="lnt">41 </span><span class="lnt">42 </span><span class="lnt">43 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span> <span class="c1">; db定义字节单元数据 、dw字义字单元数据、dd定义双字单元数据 </span> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">c</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">c</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">a</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; ds定位到a段</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">b</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">es</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; es定位到b段</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> <span class="c1">; 偏移地址</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">8</span> <span class="c1">; 循环次数8次</span> </span></span><span class="line"><span class="cl"><span class="nl">s:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">dl</span><span class="p">,</span><span class="nb">ds</span><span class="p">:[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 把a段当前偏移位置的数值传送到dl</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">dl</span><span class="p">,</span><span class="nb">es</span><span class="p">:[</span><span class="nb">bx</span><span class="p">]</span> <span class="c1">; 把b段当前偏移位置的数值加到dl中</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="nb">ds</span> <span class="c1">; 因为后面要用ds定位c段的数据,这里先把ds放入到栈中后续再取出复原到a段</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">c</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> <span class="c1">; ds定位到c段</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="p">[</span><span class="nb">bx</span><span class="p">],</span><span class="nb">dl</span> <span class="c1">; 把dl数值传送到c段的偏移位置</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">pop</span> <span class="nb">ds</span> <span class="c1">; 恢复之前存储的ds数值</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">inc</span> <span class="nb">bx</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><h2 id="第-6-题">第 (6) 题 </h2><p>程序如下,编写code段中的代码,用push指令将a段的前8个字型数据,逆序存储到b段中。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mh">0ah</span><span class="p">,</span><span class="mh">0bh</span><span class="p">,</span><span class="mh">0ch</span><span class="p">,</span><span class="mh">0dh</span><span class="p">,</span><span class="nv">oeh</span><span class="p">,</span><span class="nv">ofh</span><span class="p">,</span><span class="nv">offh</span> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">?</span> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div><p><strong>答</strong></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-nasm" data-lang="nasm"><span class="line"><span class="cl"><span class="nf">assume</span> <span class="nb">cs</span><span class="p">:</span><span class="nv">code</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">,</span><span class="mh">0ah</span><span class="p">,</span><span class="mh">0bh</span><span class="p">,</span><span class="mh">0ch</span><span class="p">,</span><span class="mh">0dh</span><span class="p">,</span><span class="mh">0eh</span><span class="p">,</span><span class="mh">0fh</span><span class="p">,</span><span class="mh">0ffh</span> </span></span><span class="line"><span class="cl"><span class="nf">a</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"> <span class="kd">dw</span> <span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"><span class="nf">b</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="ow">seg</span><span class="nv">ment</span> </span></span><span class="line"><span class="cl"><span class="nl">start:</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">a</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ds</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="nv">b</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ss</span><span class="p">,</span><span class="nb">ax</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">sp</span><span class="p">,</span><span class="mh">10h</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">0</span> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">cx</span><span class="p">,</span><span class="mi">8</span> </span></span><span class="line"><span class="cl"><span class="nl">s:</span> </span></span><span class="line"><span class="cl"> <span class="nf">push</span> <span class="p">[</span><span class="nb">bx</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="nf">add</span> <span class="nb">bx</span><span class="p">,</span><span class="mi">2</span> </span></span><span class="line"><span class="cl"> <span class="nf">loop</span> <span class="nv">s</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nf">mov</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">4c00h</span> </span></span><span class="line"><span class="cl"> <span class="nf">int</span> <span class="mh">21h</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">code</span> <span class="nv">ends</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nf">end</span> <span class="nv">start</span> </span></span></code></pre></td></tr></table> </div> </div> 所有文章 https://mingming.wang/archives/ Tue, 28 May 2019 00:00:00 +0000 https://mingming.wang/archives/ 搜索 https://mingming.wang/search/ Mon, 01 Jan 0001 00:00:00 +0000 https://mingming.wang/search/ 我的书单 https://mingming.wang/books/ Mon, 01 Jan 0001 00:00:00 +0000 https://mingming.wang/books/ <h2 id="2024">2024 </h2><table> <thead> <tr> <th style="text-align: left">书名</th> <th style="text-align: left">作者</th> <th style="text-align: left">豆瓣评分</th> <th style="text-align: left">进度</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/30218046/" target="_blank" rel="external nofollow noopener noreferrer" >《A Philosophy of Software Design》</a> </td> <td style="text-align: left">John Ousterhout</td> <td style="text-align: left">9.2</td> <td style="text-align: left"><font color="orange"> 在读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25867785/" target="_blank" rel="external nofollow noopener noreferrer" >《正义之心》</a> </td> <td style="text-align: left">乔纳森•海特</td> <td style="text-align: left">8.6</td> <td style="text-align: left"><font color="orange"> 在读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/30208077/" target="_blank" rel="external nofollow noopener noreferrer" >《禅与摩托车维修艺术》</a> </td> <td style="text-align: left">罗伯特·M.波西格</td> <td style="text-align: left">8.4</td> <td style="text-align: left"><font color="orange"> 在读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25881855/" target="_blank" rel="external nofollow noopener noreferrer" >《大教堂与集市》</a> </td> <td style="text-align: left">Eric S. Raymond</td> <td style="text-align: left">8.4</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/26852425/" target="_blank" rel="external nofollow noopener noreferrer" >《什么是科学》</a> </td> <td style="text-align: left">吴国盛</td> <td style="text-align: left">8.7</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/27168433/" target="_blank" rel="external nofollow noopener noreferrer" >《基因传:众生之源》</a> </td> <td style="text-align: left">悉达多·穆克吉</td> <td style="text-align: left">8.6</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25818441/" target="_blank" rel="external nofollow noopener noreferrer" >《1984:反乌托邦小说三部曲》</a> </td> <td style="text-align: left">乔治奥威尔</td> <td style="text-align: left">9.5</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25798867/" target="_blank" rel="external nofollow noopener noreferrer" >《我们:反乌托邦小说三部曲》</a> </td> <td style="text-align: left">叶甫盖尼·扎米亚京</td> <td style="text-align: left">7.8</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25700427/" target="_blank" rel="external nofollow noopener noreferrer" >《美妙的新世界:反乌托邦小说三部曲》</a> </td> <td style="text-align: left">赫胥黎</td> <td style="text-align: left">9.0</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> </tbody> </table> <h2 id="2023">2023 </h2><table> <thead> <tr> <th style="text-align: left">书名</th> <th style="text-align: left">作者</th> <th style="text-align: left">豆瓣评分</th> <th style="text-align: left">进度</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/20507206/" target="_blank" rel="external nofollow noopener noreferrer" >《众病之王:癌症传》</a> </td> <td style="text-align: left">悉达多·穆克吉</td> <td style="text-align: left">9.0</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/11445548/" target="_blank" rel="external nofollow noopener noreferrer" >《自私的基因》</a> </td> <td style="text-align: left">理查德·道金斯</td> <td style="text-align: left">8.4</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/4760224/" target="_blank" rel="external nofollow noopener noreferrer" >《许三观卖血记》</a> </td> <td style="text-align: left">余华</td> <td style="text-align: left">9.2</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> </tbody> </table> <h2 id="2022">2022 </h2><table> <thead> <tr> <th style="text-align: left">书名</th> <th style="text-align: left">作者</th> <th style="text-align: left">豆瓣评分</th> <th style="text-align: left">出版年</th> <th style="text-align: left">进度</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/4913064/" target="_blank" rel="external nofollow noopener noreferrer" >《活着》</a> </td> <td style="text-align: left">余华</td> <td style="text-align: left">9.4</td> <td style="text-align: left">2012-8</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/25985021/" target="_blank" rel="external nofollow noopener noreferrer" >《人类简史:从动物到上帝》</a> </td> <td style="text-align: left">尤瓦尔·赫拉利</td> <td style="text-align: left">9.1</td> <td style="text-align: left">2014-11</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/3266609/" target="_blank" rel="external nofollow noopener noreferrer" >《流浪地球》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">8.4</td> <td style="text-align: left">2008-11</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/1192090/" target="_blank" rel="external nofollow noopener noreferrer" >《球状闪电》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">8.7</td> <td style="text-align: left">2005-6</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left">《赡养上帝》</td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">-</td> <td style="text-align: left">-</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/36447647/" target="_blank" rel="external nofollow noopener noreferrer" >《赡养人类》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">8.6</td> <td style="text-align: left">2016-7</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> </tbody> </table> <h2 id="2021">2021 </h2><table> <thead> <tr> <th style="text-align: left">书名</th> <th style="text-align: left">作者</th> <th style="text-align: left">豆瓣评分</th> <th style="text-align: left">出版年</th> <th style="text-align: left">进度</th> </tr> </thead> <tbody> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/3652388/" target="_blank" rel="external nofollow noopener noreferrer" >《程序员的自我修养:链接、装载与库》</a> </td> <td style="text-align: left">俞甲子 / 石凡 / 潘爱民</td> <td style="text-align: left">8.9</td> <td style="text-align: left">2009-4</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/35038473/" target="_blank" rel="external nofollow noopener noreferrer" >《汇编语言》</a> </td> <td style="text-align: left">王爽</td> <td style="text-align: left">9.8</td> <td style="text-align: left">2020-1</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/1083428/" target="_blank" rel="external nofollow noopener noreferrer" >《傲慢与偏见》</a> </td> <td style="text-align: left">奥斯丁</td> <td style="text-align: left">8.9</td> <td style="text-align: left">1993-7</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left">《微纪元》</td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">-</td> <td style="text-align: left">-</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/5363767/" target="_blank" rel="external nofollow noopener noreferrer" >《三体Ⅲ:死神永生》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">9.2</td> <td style="text-align: left">2010-11</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/3066477/" target="_blank" rel="external nofollow noopener noreferrer" >《三体Ⅱ:黑暗森林》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">9.3</td> <td style="text-align: left">2008-5</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/2567698/" target="_blank" rel="external nofollow noopener noreferrer" >《三体:地球往事》</a> </td> <td style="text-align: left">刘慈欣</td> <td style="text-align: left">8.9</td> <td style="text-align: left">2008-1</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/4199741/" target="_blank" rel="external nofollow noopener noreferrer" >《代码整洁之道》</a> </td> <td style="text-align: left">Robert C. Martin</td> <td style="text-align: left">8.6</td> <td style="text-align: left">2010-1</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/2035179/" target="_blank" rel="external nofollow noopener noreferrer" >《动物农场》</a> </td> <td style="text-align: left">乔治·奥威尔</td> <td style="text-align: left">9.3</td> <td style="text-align: left">2007-3</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> <tr> <td style="text-align: left"><a class="link" href="https://book.douban.com/subject/1467022/" target="_blank" rel="external nofollow noopener noreferrer" >《上帝掷骰子吗:量子物理史话》</a> </td> <td style="text-align: left">曹天元</td> <td style="text-align: left">9.2</td> <td style="text-align: left">2006-1</td> <td style="text-align: left"><font color="green"> 已读 </font></td> </tr> </tbody> </table> 友情链接 https://mingming.wang/friends/ Mon, 01 Jan 0001 00:00:00 +0000 https://mingming.wang/friends/ <blockquote> <p>评论区留言申请~</p></blockquote> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">王明明的小站</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">https://mingming.wang/logo.svg</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">website</span><span class="p">:</span><span class="w"> </span><span class="l">https://mingming.wang</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">记录&amp;分享</span><span class="w"> </span></span></span></code></pre></td></tr></table> </div> </div><ol> <li>如果您想交换链接,请在您的站点内添加本站链接,然后按以上述格式发表评论。</li> <li>网站故障、停止维护及不当内容可能被取消链接!</li> </ol>