当前位置: 首页 >热点 >

环球热头条丨汇编源程序代码(四):交叉循环:两个字符串的大、小写字母转换(王爽 汇编 7.4节)

来源:创业网 2023-05-13 13:09:42

书本所用的方法是,使用两个并列的 loop 循环,分别实现两个字符串大、小写字母的转换。其中以下 3 条指令存在重复使用:mov al,[bx]mov [bx],alinc bx为避免重复使用相同代码,以达到减少代码量目的,设计以下算法:

assume cs:codesg,ds:datasg


(资料图)

datasg segment

db 'BaSiC'

db 'iNfOrMaTiOn'

datasg ends

codesg segment

start:mov ax,datasg

mov ds,ax; 设置 ds 指向 datasg 段

mov bx,0; 设置 (bx)=0,ds:bx 指向“BaSiC”的第一个字母

mov dx,8; (dx)=两个字符串的长度差+2

s:mov al,[bx]; 将 ASCII 码从 ds:bx 所指向的单元中读取到 AL 寄存器

and al,11011111B; 将 AL 寄存器中存储的 ASCII 码第 5 位二进制数值置为 0,变为大写字母

mov [bx],al; 将转变后的 ASCII 码写回原内存单元

u:add bx,5; 将“BaSic”的长度加到 bx 上,使得 ds:[bx] 指向“iNfOrMaTiOn”相应的字符

mov ah,[bx]; 将 ASCII 码从 ds:bx 所指向的单元中读取到 AH 寄存器

or ah,00100000B; 将 AH 寄存器中存储的 ASCII 码第 5 位二进制数值置为 1,变为小写字母

mov [bx],ah; 将转变后的 ASCII 码写回原内存单元

sub bx,5; 恢复 bx 的值

; 设置 cx 与 bx 的距离,并将该距离值(即“BaSiC”转换所需要执行的循环次数)存入 CX 寄存器:

; 1. 当字符串“BaSiC”未转换完成之前,该距离等于转换“BaSiC”还剩余需要执行的 s 循环次数

; 2. 当字符串“BaSiC”已转换完成,该距离总等于 1,使 loop s 循环得以终止而不再执行 s 循环

mov ax,11; 将字符串“iNfOrMaTiOn”的长度值存入 AX 寄存器

sub ax,dx; DX 寄存器存储着两个字符串长度的差值加 2 后的数值

add ax,2; 使得 (ax)=字符串“BaSiC”的长度

mov cx,ax

sub cx,bx; 计算 loop s 的剩余循环次数

inc bx; (bx) 加 1,ds:bx 指向下一个字母

loop s; “BaSiC”转换完成后,loop s 指令执行结果为 (cx)=0,以终止 s 循环

; 设置 loop u 循环计数器,令当 (dx)=0 时,终止 loop u 循环,即 (cx)=0

sub dx,1

mov cx,dx

loop u

mov ax,4c00h

int 21h

codesg ends

end start

相关阅读

关键词:

大家还在看
热词