王明明的小站
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 "e ++enc=gbk"
</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 > 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">"*"</span> --exclude<span class="o">=</span><span class="s2">"Makefile"</span> --exclude-dir<span class="o">=</span><span class="s2">".git"</span> <span class="s2">"TODO:"</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">'C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\企业微信\\企业微信.lnk'</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">"</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\BT_backup"</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">></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">".\backup.zip"</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">".\backup.old.zip"</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="k">RD</span> /S /Q <span class="s2">".\backup.old.zip"</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">".\backup.zip"</span> <span class="s2">".\backup.old.zip"</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">"</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\BT_backup"</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">></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">></span> NUL
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="macos--linux">MacOS & 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">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.local/share/qBittorrent/BT_backup"</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">"</span><span class="nv">$system</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"Darwin"</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">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/Library/Application Support/qBittorrent/BT_backup"</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">"</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">"</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">"没有找到 qBittorrent 的任务数据文件,无法进行备份,按任意键结束..."</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">"./backup.zip"</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">"./backup.old.zip"</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">"./backup.old.zip"</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">"./backup.zip"</span> <span class="s2">"./backup.old.zip"</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">"</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">"</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">"备份完成,按任意键结束..."</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">".\backup.zip"</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">".\backup.zip"</span> -d <span class="s2">"</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\"</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">></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">".\backup.old.zip"</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">></span> NUL
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">unzip <span class="s2">".\backup.old.zip"</span> -d <span class="s2">"</span><span class="nv">%LocalAppData%</span><span class="s2">\qBittorrent\"</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">></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">></span> NUL
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="macos--linux-1">MacOS & 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">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.local/share/qBittorrent/"</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">"</span><span class="nv">$system</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"Darwin"</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">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/Library/Application Support/qBittorrent/"</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">"</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">"</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">"没有找到 qBittorrent 的任务数据文件,无法进行备份,按任意键结束..."</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">"./backup.zip"</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">"</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">"</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">"./backup.old.zip"</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">"./backup.old.zip"</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">"没有可以使用的备份,还原终止,按任意键结束..."</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">"</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">"</span> -d <span class="s2">"</span><span class="si">${</span><span class="nv">data_path</span><span class="si">}</span><span class="s2">"</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">"成功从</span><span class="si">${</span><span class="nv">backup_file</span><span class="si">}</span><span class="s2">还原任务数据,按任意键结束..."</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ə’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> 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">{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"100.127.9.2","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.003277","position":100389087,"serverId":1686047208,"timestamp":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">"@type"</span>:<span class="s2">"com.alibaba.otter.canal.protocol.position.LogPosition"</span>,<span class="s2">"identity"</span>:<span class="o">{</span><span class="s2">"slaveId"</span>:-1,<span class="s2">"sourceAddress"</span>:<span class="o">{</span><span class="s2">"address"</span>:<span class="s2">"100.127.9.233"</span>,<span class="s2">"port"</span>:3306<span class="o">}}</span>,<span class="s2">"postion"</span>:<span class="o">{</span><span class="s2">"gtid"</span>:<span class="s2">""</span>,<span class="s2">"included"</span>:false,<span class="s2">"journalName"</span>:<span class="s2">"mysql-bin.000255"</span>,<span class="s2">"position"</span>:226215458,<span class="s2">"serverId"</span>:1686047208,<span class="s2">"timestamp"</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 > Group > 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 > 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 > 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">"add"</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">"add"</span><span class="o">])</span> <span class="o">></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">></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">": "</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"> <n> <span class="o">=</span> 密钥在 n 天后过期
</span></span><span class="line"><span class="cl"> <n>w <span class="o">=</span> 密钥在 n 周后过期
</span></span><span class="line"><span class="cl"> <n>m <span class="o">=</span> 密钥在 n 月后过期
</span></span><span class="line"><span class="cl"> <n>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 <[email protected]>”
</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 <[email protected]>
</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 <[email protected]>
</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 <[email protected]>
</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 <[email protected]>
</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><keyid></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">"Initial commit"</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">></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">></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">'echo "deb https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'</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">&&</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">"deb https://download.mono-project.com/repo/debian stable-buster main"</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>References</code> 的 <code>External Tool</code> 中,<code>external script editor</code> 选择 <code>Visual Studio Code</code>,如果没有<code>Visual Studio Code</code>选项,则选择Browser,到 <code>usr>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">"deb https://www.plasticscm.com/plasticrepo/stable/debian/ ./"</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">"deb https://www.plasticscm.com/plasticrepo/stable/debian/ ./"</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">'1975'</span><span class="p">,</span><span class="s">'1976'</span><span class="p">,</span><span class="s">'1977'</span><span class="p">,</span><span class="s">'1978'</span><span class="p">,</span><span class="s">'1979'</span><span class="p">,</span><span class="s">'1980'</span><span class="p">,</span><span class="s">'1981'</span><span class="p">,</span><span class="s">'1982'</span><span class="p">,</span><span class="s">'1983'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1984'</span><span class="p">,</span><span class="s">'1985'</span><span class="p">,</span><span class="s">'1986'</span><span class="p">,</span><span class="s">'1987'</span><span class="p">,</span><span class="s">'1988'</span><span class="p">,</span><span class="s">'1989'</span><span class="p">,</span><span class="s">'1990'</span><span class="p">,</span><span class="s">'1991'</span><span class="p">,</span><span class="s">'1992'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1993'</span><span class="p">,</span><span class="s">'1994'</span><span class="p">,</span><span class="s">'1995'</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>编程, 在屏幕蹭分别显示绿色、绿底红色、白底蓝色的字符串 ‘welcome to masm!’。</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">'welcome to masm!'</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>…</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">'1975'</span><span class="p">,</span><span class="s">'1976'</span><span class="p">,</span><span class="s">'1977'</span><span class="p">,</span><span class="s">'1978'</span><span class="p">,</span><span class="s">'1979'</span><span class="p">,</span><span class="s">'1980'</span><span class="p">,</span><span class="s">'1981'</span><span class="p">,</span><span class="s">'1982'</span><span class="p">,</span><span class="s">'1983'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1984'</span><span class="p">,</span><span class="s">'1985'</span><span class="p">,</span><span class="s">'1986'</span><span class="p">,</span><span class="s">'1987'</span><span class="p">,</span><span class="s">'1988'</span><span class="p">,</span><span class="s">'1989'</span><span class="p">,</span><span class="s">'1990'</span><span class="p">,</span><span class="s">'1991'</span><span class="p">,</span><span class="s">'1992'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1993'</span><span class="p">,</span><span class="s">'1994'</span><span class="p">,</span><span class="s">'1995'</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">'year summ ne ?? '</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">'1975'</span><span class="p">,</span><span class="s">'1976'</span><span class="p">,</span><span class="s">'1977'</span><span class="p">,</span><span class="s">'1978'</span><span class="p">,</span><span class="s">'1979'</span><span class="p">,</span><span class="s">'1980'</span><span class="p">,</span><span class="s">'1981'</span><span class="p">,</span><span class="s">'1982'</span><span class="p">,</span><span class="s">'1983'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1984'</span><span class="p">,</span><span class="s">'1985'</span><span class="p">,</span><span class="s">'1986'</span><span class="p">,</span><span class="s">'1987'</span><span class="p">,</span><span class="s">'1988'</span><span class="p">,</span><span class="s">'1989'</span><span class="p">,</span><span class="s">'1990'</span><span class="p">,</span><span class="s">'1991'</span><span class="p">,</span><span class="s">'1992'</span>
</span></span><span class="line"><span class="cl"> <span class="kd">db</span> <span class="s">'1993'</span><span class="p">,</span><span class="s">'1994'</span><span class="p">,</span><span class="s">'1995'</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">'year summ ne ?? '</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">' '</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">' '</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">' '</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">' '</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">记录&分享</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>如果您想交换链接,请在您的站点内添加本站链接,然后按以上述格式发表评论。</li>
<li>网站故障、停止维护及不当内容可能被取消链接!</li>
</ol>