《汇编语言》学习(七)寻址

    《汇编语言》第7章主要介绍汇编语言中的几种寻址方式,除了一般的“段+偏移”外,对于数组,还有“基地址+索引”这种类似C语言的寻址方式。本章的学习主要在于对各种寻址方式的理解和灵活运用——不同的寻址方式是为了更好地解决不同应用场景下的问题而设计的。

    本文我将先给出一个知识图谱,然后再列几个小程序演示这一课的重点内容。

一、知识图谱


二、程序清单

1,大小写转换

assume cs:codesg,ds:datasg
datasg segment
 db 'BaSiC'
 db 'MinIx'
datasg ends
codesg segment
 start:mov ax,datasg
       mov ds,ax
       mov bx,0
       mov cx,5
     s:mov al,[bx]
       and al,11011111b
       mov [bx],al
       mov ah,[5+bx]
       or ah,00100000b
       mov [5+bx],ah
       inc bx
       loop s

       mov ax,4c00h
       int 21h
codesg ends
end start

    这个程序用于将“BaSic”中的小写转为大写,将“MinIx”中的大写转为小写。它主要运用“字符的ASCII编码的特征”和“按位逻辑运算”两种理论,标红的行是其中的关键行,需要仔细体会。

大写    十六进制    二进制                  小写    十六进制    二进制
 A        41      01000001                    a       61       01100001
 B        42      01000010                    b       62       01100010
 C        43      01000011                    c       63       01100011
 D        44      01000100                    d       64       01100100
 E        45      01000101                    e       65       01100101

2,数组的寻址

    用C语言实现上述程序的功能,如下:

char a[] = "BaSiC";
char b[] = "MinIX";

void main()
{
	int i = 0;
	do
	{
		a[i] = a[i] & 0xDF;
		b[i] = b[i] | 0x20;
		i++;
	} while (i < 5);
}

    汇编程序中的“[bx]和[5+bx]”,可以分别写成“0[bx]和5[bx]”。对比两个程序:

C语言:    a[i], b[i]

汇编语言:0[bx], 5[bx]

    我们可以发现,[bx+idata]的方式为高级语言实现数组提供了便利机制。


3,二重循环

 编程,将datasg段中的每个单词的前4个字母改写为大写字母。

assume cs:codesg,ss:stacksg,ds:datasg

stacksg segment
 dw 0,0,0,0,0,0,0,0
stacksg ends

datasg segment
 db '1. display      '
 db '2. brows        '
 db '3. replace      '
 db '4. modify       '
datasg ends

codesg segment
 start:mov ax,stacksg
       mov ss,ax
       mov sp,10h
       mov ax,datasg
       mov ds,ax

       mov bx,0
       mov cx,4
     s:push cx
       mov si,0
       mov cx,4
    s0:mov al,[bx+si+3]
       and al,11011111b
       mov [bx+si+3],al
       inc si
       loop s0
       add bx,10h
       pop cx
       loop s

       mov ax,4c00h
       int 21h
codesg ends

end start

    这道编程题,综合运用了本章的各个知识点——按位逻辑运算,寻址,栈缓存,二重循环。请仔细体会以下几点:

1,栈缓存数据的便利性(不用记录数据保存的位置)。

2,二重循环的处理(两个循环变量)。

3,按位逻辑运算(ASCII码的特征)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值