《汇编语言》总结04 —— 更灵活的定位内存地址的方法

(一)and和or指令

  1. and指令:逻辑与指令,按位进行与运算

    mov al,01100011B

    and al,00111011B

    执行后,al=00100011B

    作用:通过该指令可将操作对象的相应位设为0,其他位不变。

  2. or指令:逻辑或指令,按位进行或运算

    mov al,01100011B

    or al,00111011B

    执行后:al=011111011B

    作用:通过该指令可将操作对象的相应位设为1,其他位不变。

(二)关于ASCII码

世界上有很多编码方案,有一种方案叫做ASCII编码,是在计算机系统中通常被采用的。简单地说,所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。比如说,在ASCII编码方案中,用61H表示“a”,62H表示“b”。一种规则需要人们遵守才有意义。

一个文本编辑过程中,就包含着按照ASCII编码规则进行的编码和解码。在文本编辑过程中,我们按一下键盘的a键,就会在屏幕上看到“a”。这是怎样一个过程呢?我们按下键盘的a键,这个按键的信息被送入计算机,计算机用ASCII码的规则对其进行编码,将其转化为61H存储在内存的指定空间中;文本编辑软件从内存中取出61H,将其送到显卡的显存中;工作在文本模式下的显卡,用ASCII码的规则解释显存中的内容,61H被当作字符“a”,显卡驱动显示器,将字符“a”的图像画在屏幕上。

(三)以字符形式给出的数据

我们可以在汇编程序中,用‘...‘的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ASCII码,如下:

assume cs:code,ds:data

data segment

db ‘unIX‘

db ‘foRK‘

data ends

code segment

start:mov al,‘a‘

mov bl,‘b‘

mov ax,4c00h

int 21h

code ends

end start

(四)大小写转换问题

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 cx,5         ;设置循环次数5,因为‘BaSiC‘有5个字母

s:  mov al,[bx]        ;将ASCII码从ds:bx所指向的单元中取出

add al,11011111B     ;将al中的ASCII码的第5位置为0,变为大写字母

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

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

loop s

mov bx,5         ;设置(bx)=5,ds:bx指向‘iNfOrMaTiOn‘的第一个字母

mov cx,11        ;设置循环次数11,因为‘iNfOrMaTiOn‘有11个字母

s0:  mov al,[bx]

or al,00100000B     ;将al中的ASCII码的第5位置为1,变为小写字母

mov [bx],al

inc bx

loop s0

mov ax,4c00h

int 21h

codesg ends

code start

(五)[bx+idata]

在前面总结中,我们用[bx]的方式来指明一个内存单元,还可以用一种更为灵活的方式来指明内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata,比如:

mov ax,[bx+200]

数学化的描述为:(ax)=((ds)*16+(bx)+200)

也可以写为:

mov ax,[200+bx]

mov ax,200[bx]

mov ax,[bx].200

那这种方式有什么用呢?我们可以用[bx+idata]的方式进行数组的处理

assume cs:codesg,ds:datasg

datasg segment

db ‘BaSiC‘

db ‘MinIX‘

datasg ends

codesg segment

start:

codesg ends

end start

按照我们原来的方法,用[bx]的方式定位字符串中的字符。代码段如下:

mov ax,datasg

mov ds.ax

mov bx,0

mov cx,5

s:mov al,[bx]

and al,11011111B

mov [bx],al

inc bx

loop s

mov bx,5

mov cx,5

s0:mov al,[bx]

or al,00100000B

mov [bx],al

inc bx

loop s0

现在我们用[bx+idata]对上面的代码进行简化,如下:

mov ax,datasg

mov ds,ax

mov bx,0

mov cx,5

s:mov al,[bx]

and al,11011111B

mov [bx],al

mov al,[5+bx]

or al,00100000B

mov [5+bx],al

inc bx

loop s

但也可以写成下面这种:

mov ax,datasg

mov ds,ax

mov bx,0

mov cx,5

s:mov al,0[bx]

and al,11011111B

mov 0[bx],al

mov al,5[bx]

or al,00100000B

mov 5[bx],al

inc bx

loop s

如果我们用高级语言,比如C语言来描述上述程序,大致如下:

char a[5] = "BaSiC";
char b[5] = "MinIX";
main()
{
    int i;
    i = 0;
    do
    {
        a[i] = a[i] & 0xDF;
        b[i] = b[i] & 0x20;
        i++;
    }
    while(i < 5);
}

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

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

(六)SI和DI

si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用

(七)[bx+si]和[bx+di]

[bx+si]和[bx+di]的含义相似,都表示一个内存单元,它的偏移地址为(bx)+(si)

mov ax,[bx+si]

数学化的描述为:(ax)=((ds)*16+(bx)+(si))

也可以写成如下格式:

mov ax,[bx][si]

(八)[bx+si+idata]和[bx+di+idata]

[bx+si+idata]和[bx+di+idata]含义相似,表示一个内存单元,它的偏移地址为(bx)+(si)+idata

mov ax,[bx+si+idata]

数学化的描述为:(ax)=((ds)*16+(bx)+(si)+idata)

该指令也可写成如下格式:

mov ax,[bx+200+si]

mov ax,[200+bx+si]

mov ax,200[bx][si]

mov ax,[bx].200[si]

mov ax,[bx][si].200

(九)不同的寻址方式的灵活应用

  1. [idata]用一个常量来表示地址,可用于直接定位一个内存单元。
  2. [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。
  3. [bx+idata]用一个变量和一个常量表示内存地址,可在一个起始地址的基础上用变量间接定位一个内存单元。
  4. [bx+si]用两个变量表示地址。
  5. [bx+si+idata]用两个变量和一个常量表示地址。

总结完毕!

时间: 2024-10-13 22:14:56

《汇编语言》总结04 —— 更灵活的定位内存地址的方法的相关文章

更灵活的定位内存地址的方法(学习汇编)

1.and指令:逻辑与指令,按位进行与运算.与1不变,与0变0,可将对象相应位设为0. 2.or指令:逻辑或指令,按为进行或运算.或1变1,或0变0,可将对象位设为1. 3.[BX+idata]的几种表现形式: mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 4.SI和DI是8086CPU中和Bx功能相似的寄存器,只是不能分成两个8位的寄存器来用. 5.[BX+SI]进行内存地址定位的几种形式: mov ax,[bx][si] mov ax,[bx+

汇编语言学习第七章-更灵活的定位内存地址的方法

本博文系列参考自<<汇编语言>>第三版,作者:王爽 前面已经通过类似[0]和[bx]的方法进行了内存定位了.本章将涉及更多内存地址定位和编程的方法. 7.1 and 和 or 指令 (1) and指令,逻辑按位与指令 例如: mov al,01100011B and al,00111011B 执行后 al=00100011B and指令可以用来将某个数的位置为零. 比如我们要将al的第二位置为零,则: and al,11111101B 依次类推. (2) or指令,逻辑按位或指令

汇编语言——更灵活的定位内存地址的方法

and和or指令 1.and指令 将2进制中的1当做真,2进制中的0当做假 则:只有2个事件都为真的时候才为真,即1&&1==>1,1&&0==>0,0&&0==>0: 用处:假如想把一个数的第7位变成0,让它和01111111B执行与操作就好了 1 mov al,10001101B ; 8位数据 2 3 add al,01111111B 4 5 >> (al)=00001101B 2.or指令 只要2个事件中有1个是真即为真,

第七章 更灵活的定位内存地址的方法

一.and和or指令 ①and指令:逻辑与指令,按位进行与运算.(仅在1与1时结果中为1) eg:mov al,01100011B and al,00111011B 结果:al=00100011B 作用:通过该指令可以将操作对象的相应位设为0,其他位不变. ②or指令:逻辑或指令,按位进行或运算.(仅在0或0时为0) eg:mov  al,01100011B or   al,00111011B 结果:al=01111011B 作用:通过该指令可以将操作对象的相应位设为1,其他位不变. 注意:(1

第七章 更灵活的定位内存地址的方法 知识梳理

and和or指令 and逻辑与指令 作用:通过该指令可以将操作对象的相应位设为0,其他位不变 or 逻辑或指令 作用:通过该指令可以将操作对象的相应位设为1,其他位不变 [bx+idata]  [bx+si] [bx+di] si,di 在8086CPU中和BX功能相近的寄存器 si和di不能分成两个8位寄存器来使用! 等效写法 两个变量表示地址:[bx+si]  ↔  [si+bx], [bx][si], [si][bx] 一个变量一个常量表示地址:[bx+idata]  ↔  [bx]ida

汇编语言:第七章 更灵活定位内存地址的方法

7.1 and 和 or 指令 二进制的and or 可以将某位归0或置1 7.2 关于ASCII码 7.3 以字符形式给出数据 data segment db 'unIX'                    //相当于db 75H,6EH,49H,58H db 'foRK' //相当于db 66H,6FH,52H,4BH data ends mov al,'a'   //相当于mov al,61H 7.4 大小写转换问题 db 'BaSiC' db 'iNfOrMaTiOn' 如何将第一个

汇编语言学习笔记(7)——更灵活地定位内存

1.and指令 逻辑与指令,按位进行与运算,例如: mov al,01100011B and al,00111011B 计算后的al结果为:00100011B 计算过程: 0 1 1 0 0 0 1 1 B 0 0 1 1 1 0 1 1 B ---------------------------- 0 0 1 0 0 0 1 1 B 可以看出,逻辑与运算两个二进制的思路是,设1为真,0为假,则按位对应两个数,同一位置上下两个值同为真则结果为真(1),同为假则结果为假(0),一真一假结果为假(0

重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息

今天公司的路由器出现问题,服务器的IP地址也跟着变了,但是原来的svn已经设置好了,现在需要更换地址 查询原地址的方法: [ruby] view plain copy print? root@jack-desktop:codes# svn info 路径: . URL: http://192.168.1.58/repos 版本库根: http://192.168.1.58/repos/linux_monitor 版本库 UUID: 81fe7417-a8b1-40d6-90b8-66197304

解决新装 Win 7 SP1 系统更新高CPU及内存占用率方法

最近重新安装了win7 sp1,系统更新始终无法工作,开始怀疑是驱动安装出现问题.但反复安装新旧驱动也解决不了问题,出现update服务cpu(Svchost.exe)占用居高不下的情况.网上也找了不少办法,什么重启服务,修复Windows更新服务等一系列不靠谱的方法,都是无济于事.几乎翻遍了整个互联网终于功夫不负有心人,找到了最终解决方法,就是需要提前安装一个补丁,但经过反复实验,事实证明需要安装两个补丁. 1.KB3102810 该补丁可以解决更新时CPU满载及大内存占用的情况 2.KB94