码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-10 20:31:09      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

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‘

如何将第一个字符串转成大写,第二个小写?

我们将ASCII码拿出来对比一下:

大写    十六进制    二进制        小写    十六进制    二进制

A      41      010000001      a      61     01100001

B      42      010000010      b        62      01100010

C      43      010000011      c        63      01100011

.....                        ........

易知:小写字母比大写字母大20H,二进制中即第五位(位从0开始)为1和0

由于我们没有条件判断的指令来+或—20H来改变大小写,所以在这里用and 和 or指令改变二进制第六位数值来达到目的:

assume cs:code,ds:data
data segment
db ‘BaSiC‘
db ‘iNfOrMaTiOn‘
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,5
s:
mov al,ds:[bx]
and al,11011111B    //第一个循环,前5个内存单元第五位归0  变大写
mov ds:[bx],al
inc bx
loop s

mov cx,11
s2:
mov al,ds:[bx]
or al,00100000B    //第一个循环,后11个内存单元第五位置1 变小写
mov ds:[bx],al
inc bx
loop s2

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

7.5 [bx+idata]

用bx+idata来更灵活的指定偏移地址,也可以写成 idata[bx]很方便的用于表示数组(起始位置在idata,索引在bx)

7.6 用[bx+idata]处理数组

assume cs:code,ds:data          //C语言
data segment
db ‘BaSiC‘            //char  a[5] = "BaSiC";
db ‘MinIX‘            // char b[5] = "MinIX";
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0          // int i = 0;
mov cx,5
s:              //do{
mov al,ds:0[bx]
and al,11011111B      // a[bx] = a[bx] & 0xdf
mov ds:[bx],al


mov al,ds:5[bx]
or al,00100000B      //     b[bx] = b[bx] | 0x20
mov ds:5[bx],al
inc bx            // i++;
loop s           //while (i < 5)

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

 

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

标签:

原文地址:http://www.cnblogs.com/superzhao/p/4636489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!