惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
Cloudbric
Cloudbric
I
InfoQ
V
V2EX
博客园_首页
The Register - Security
The Register - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts
Vercel News
Vercel News
Forbes - Security
Forbes - Security
云风的 BLOG
云风的 BLOG
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
D
DataBreaches.Net
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
A
About on SuperTechFans
N
News and Events Feed by Topic
Apple Machine Learning Research
Apple Machine Learning Research
Help Net Security
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
N
Netflix TechBlog - Medium
Spread Privacy
Spread Privacy
F
Full Disclosure
Recorded Future
Recorded Future
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
The Cloudflare Blog
T
Threatpost
T
Tor Project blog
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
A
Arctic Wolf
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News - Newest:
Hacker News - Newest: "LLM"
WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
小众软件
小众软件
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Proofpoint News Feed
Security Latest
Security Latest
The Last Watchdog
The Last Watchdog

faryou的博客

出租车上的对话 faryou的博客-告别小高一 faryou的博客-中考 · 竞赛 · 生活 · 思考 5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【汇编基础教程】更灵活的定位内存
作者: faryou · 2026-01-30 · via faryou的博客

前言

上期我们学习了用[bx]定位内存的方法,今天让我们进一步学习一些定位内存的方法。

and和or指令

这是两个位运算指令,and表示逻辑与,or表示逻辑或,格式如下:

and/or 寄存器名,参数值

可以实现对寄存器内的数及参数值进行位运算,结果存在该寄存器中。

[bx+idata]

(idata泛指常数,由编程者决定)
可以表示值为(bx)+idata的偏移地址(即bx寄存器的值加上idata这一常数作为偏移地址)。

[bx+di/si]

di和si寄存器功能与bx相近,但是不能分割为两个八位寄存器。
[bx+di]、[bx+si]分别表示(bx)+(di)、(bx)+(si)作为偏移地址。

[bx+di/si+idata]

表示(bx)+(di/si)+idata)作为偏移地址。

简单应用一下

练个题~
编程,将datasg段中每个单词改成小写字母

assume cs:codesg,ds:datasg

datasg segment
  db 'Far             '
  db 'You             '
  db 'HJC             '
  db 'BBS             '
datasg ends

codesg segment
start:
codesg ends

end start

首先,我们还没有学习判断语句,所以要改变大小写只能用别的方式。观察一下大小写字母的ASCLL码,注意到大小写字母只在第五位有区别,只要将大写字母的第五位改成1,即可实现大写转小写,由此,可以选择使用逻辑或(即前面的or指令)。
由此,我们可以使用两层循环,在每层中修改字符串前三字节的第五位为1。
还有一个问题是两层循环的实现,我们只有cx一个寄存器,所以应该用另外一个寄存器在内层循环前暂存cx的值,就用dx吧~
代码:

assume cs:codesg,ds:datasg

datasg segment
  db 'Far             '
  db 'You             '
  db 'HJC             '
  db 'BBS             '
datasg ends

codesg segment

  start:mov ax,datasg
        mov ds,ax
        mov bx,0
        mov cx,4
        
     s0:mov dx,cx    ;暂存cx
        mov si,0
        mov cx,3
        
      s:mov al,[bx+si]
        or al,00100000b
        mov [bx+si],al
        inc si
        loop s       ;内层循环
        
        add bx,16
        mov cx,dx    ;恢复cx
        loop s0      ;外层循环
        
        mov ax,4c00H
        int 21H
codesg ends
end start

数据标号和assume指令

数据标号是一种特殊的标号。之前我们介绍的“标号:”格式的标号,只能表示一个内存地址。而数据标号则具有表示地址和数据的双重功能。其格式如下:

标号名 db/dw/dd 数据1,数据2,...

可以看到,该标号在定义数据时使用。下面是其使用格式:
首先要在使用前用伪指令assume说明使用数据标号的段:

assume ds:data

这样ds寄存器就与data段产生了关联。在调用data段中的数据时,如果使用数据标号替代,编译器就会将其识别为以ds为段地址、以数据标号的偏移地址为偏移地址的内存地址或该内存地址代表的数据(有点绕,自己断下句,下面看个例子)。下面假设data段里有如下声明:

data segment
  a dw 0,0
  b db 1,2,3,4
data ends

则a、b即为data:[0]和data:[4]的数据标号。之后在代码中将ds的值设为data的段地址:

mov ax,data
mov ds,ax

即可使用该标号。下面是在一些指令中使用数据标号的例子。当其代表内存单元时:

mov ax,a    ;代表mov word ptr ax,ds:[0]
add b,al    ;代表add ds:[4],al
inc b[2]    ;代表inc ds:[4+2]
dec a[1]    ;代表dec ds:[2]

作为一个地址时,在数据标号前加上offset即可。
需要注意的悬,数据标号同时代表了一个内存单元的长度。也就是说,当其作为数据进行操作时,要注意位数问题。以下代码会导致编译错误:

mov al,a
sub ax,b

原因是al、ax的位数和a、b的位数对不上。
这里需要知道,assume是伪指令,只用来提示编译器,用assume进行所谓“关联”也并不会将段地址存入指定的段寄存器里。这个需要自己注意~