学习汇编的第八天

大小写的转换

规律:

A        41H        0100 0001
B        42H        0100 0010
C        43H        0100 0011
D        44H        0100 0100
E        45H        0100 0101    
F        46H        0100 0110


a        61H        0110 0001
b        62H        0110 0010
c        63H        0110 0011
d        64H        0110 0100
e        65H        0110 0101
f        66H        0110 0110

我们可以发现a和A之间(大写与小写之间)相差了20H,转化成10进制是32 2^5

我们只需修改第六位就能实现大小写之间的相互转化

a and 1101 1111 就能实现‘a’转化成‘A’

A or 0010 0000 就能实现‘A’转化成‘a’

assume cs:code,ds:data,ss:stack

data segment
      db 'BaSic'   
      db 'iFdOrMaTiOn' 
data ends

stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends

code segment
start:    mov bx,stack
          mov ss,bx
          mov sp,128
          
          mov bx,data
          mov ds,bx
          
          mov bx,0
          mov cx,5
          
upLetter: mov al,ds:[bx]
          and al,11011111B  
          mov ds:[bx],al
          inc bx
          loop upLetter
          

          
          mov ax,4C00H
          int 21H
code ends

end start

 将第二行字符串转换成小写

assume cs:code,ds:data,ss:stack

data segment
      db 'BaSic'  
      db 'iFdOrMaTiOn'
data ends

stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends

code segment
   start: mov bx,stack
          mov ss,bx
          mov sp,128
          
          mov bx,data
          mov ds,bx
          
          mov bx,5
          mov cx,11
          
dwLetter: mov al,ds:[bx]
          or al,00100000B
          mov ds:[bx],al
          inc bx
          loop dwLetter
          

          
          
          mov ax,4C00H
          int 21H
code ends

end start

 编码的目的

逻辑运算非常快,能使程序更快

数据结构

访问内存的方式

ds:[bx+n] 

2000:1000  BE 00 06 00 00 00 ......

mov ax,2000H
mov ds,ax

mov bx,1000H
mov ax,ds:[bx]   ax=00BEH
mov cx,ds:[bx+1] cx=0600H
mov cx,ds:[bx+2] CX=0006H

将第一行转化成大写,第二行转化成小写的几种方式

第一行和第二行长度相同的情况下

方式一(两个循环)

assume cs:code,ds:data,ss:stack

data segment
      db 'BaSic'   
      db 'MinIX' 
data ends

stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends

code segment
start:    mov bx,stack
          mov ss,bx
          mov sp,128
          
          mov bx,data
          mov ds,bx
          
          mov bx,0
          mov cx,5
          
upLetter: mov al,ds:[bx]
          and al,11011111B  
          mov ds:[bx],al
          inc bx
          loop upLetter
          
          mov bx,5
          mov cx,11
          
dwLetter: mov al,ds:[bx]
          or al,00100000B
          mov ds:[bx],al
          inc bx
          loop dwLetter                                         
          

          
          mov ax,4C00H
          int 21H
code ends

end start

 方式二(一个循环)

assume cs:code,ds:data,ss:stack

data segment
      db 'BaSic'   
      db 'MinIX' 
data ends

stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends

code segment
start:    mov bx,stack
          mov ss,bx
          mov sp,128
          
          mov bx,data
          mov ds,bx
          
          mov bx,0
          mov cx,5
          
change:   mov al,ds:[bx]
          and al,11011111B  
          mov ds:[bx],al
          mov al,ds:[bx+5]   
      or al,00100000B
      mov ds:[bx+5],al
          inc bx
          loop change                                   
          

          
          mov ax,4C00H
          int 21H
code ends

end start

 将第一行内存数据复制到第二行的三种方法

方法一:

assume cs:code,ds:data

data segment
      db 'welcome to masm!'   
      db '................' 
data ends



code segment
start:    

          
          mov ax,data
          mov ds,ax
          
          mov si,0
          mov di,16
          mov cx,8
          
copy:     mov ax,ds:[si]
          mov ds:[di],ax
          add si,2
          add di,2
          loop copy
                                 
          
  
          mov ax,4C00H
          int 21H
code ends

end start

 方法二:

assume cs:code,ds:data

data segment
      db 'welcome to masm!'   
      db '................' 
data ends



code segment
start:    

          
          mov ax,data
          mov ds,ax
          
          mov si,0
          mov di,16
          mov cx,8
          
copy:     mov ax,ds:[si]
          mov ds:[di+16],ax
          add si,2
          loop copy
                                 
          
  
          mov ax,4C00H
          int 21H
code ends

end start

方法三

assume cs:code,ds:data,ss:stack

data segment
      db 'welcome to masm!'   
      db '................' 
data ends

 stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends



code segment
start:    

          mov ax,stack
          mov,ss,ax
          mov sp,32
                     
          mov ax,data
          mov ds,ax
          
          mov si,0
          mov di,16
          
          mov cx,8
          

copy:     push ds:[si]
          pop  ds:[si+16]
          add si,2
          loop copy
                                 
          
  
          mov ax,4C00H
          int 21H
code ends

end start

方法四

assume cs:code,ds:data,ss:stack

data segment
      db 'welcome to masm!'   
      db '................' 
data ends

 stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends



code segment
start:    

          mov ax,stack
          mov,ss,ax
          mov sp,32
                     
          mov ax,data
          mov ds,ax
          mov es,ax   ;dx:[si] es:[di]
          
          mov si,0
          mov di,16          
          mov cx,8
          

copy:     mov ax,ds:[si]
          mov es:[di],ax
          add si,2
          add di,2
          loop copy
                                 
          
  
          mov ax,4C00H
          int 21H
code ends

end start

方法5:

assume cs:code,ds:data,ss:stack

data segment
      db 'welcome to masm!'   
      db '................' 
data ends

 stack segment stack
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
        dw 0,0,0,0
stack ends



code segment
start:    

          mov ax,stack
          mov,ss,ax
          mov sp,32
                     
          mov ax,data
          mov ds,ax
          mov es,ax   ;dx:[si] es:[di]
          
          mov si,0
          mov di,16          
          mov cx,8
          

copy:     push ds:[si]
          pop es:[di]
          add si,2
          add di,2
          loop copy
                                 
          
  
          mov ax,4C00H
          int 21H
code ends

end start

[bx+si]和[bx+di] 偏移地址的的组合方式

用debug查看内存,结果如下

2000:1000 BE 00 06 00 00 00 ......

写出下面的程序执行后 ax,bx,cx 中的内容

mov ax,2000H          ;ax=2000H
mov ds,ax             ;ds=2000   

mov bx,1000H          ;bx=1000H
mov si,0

mov ax,ds:[bx+si]     ;ax=2000:[1000+0] = 00 BE
inc si                ;si = si+1=1

mov cx,ds:[bx+si]     ;cx=2000:[1000+1] = 06 00
inc si                ;si = si+1 =2

mov di,si             ;di = si = 2
add cx,ds:[bx+di]     ;cx=cx+2000:[1000+2] =06 00 + 00 06 = 06 06
[bx+si+数字] 和 [bx+di+数字]
 用debug查看内存,结果如下
2000:1000 BE 00 06 00 6A 22 ......
写出下面的程序执行后  ax,bx,cx 中的内容
mov ax,2000H          ;ax=2000H
mov ds,ax             ;ds=2000   

mov bx,1000H          ;bx=1000H
mov si,0

mov ax,ds:[bx+2+si]     ;ax=2000:[1000+0+2] = 00 06
inc si                ;si = si+1=1

mov cx,ds:[bx+2+si]     ;cx=2000:[1000+1+2] = 6A 00
inc si                ;si = si+1 =2

mov di,si             ;di = si = 2
mov bx,ds:[bx+2+di]    ;bx=22 6AH

编程,将data段中的每个单词的头字母改成大写

assume cs:code,ds:data
data segment
             db         '1.file          ' 
             db         '2.edit          '
             db         '3.serch         '
             db         '4.view          '
             db         '5.options       '
             db         '6.help          '
data ends

code segment
  start: mov ax,data
         mov ds,ax
         
         mov bx,0
         mov si,2
         mov cx,6
         
change:    mov al,ds:[bx+si]
        and al,11011111B
        mov ds:[bx+si],al
        add bx,16
        loop change

         
         mov ax,4C00H
         int 21H


code ends

end start

编程,将data段中的每个字母都改成大写 

assume cs:code,ds:data
data segment
             db         'ibm             ' 
             db         'dec             '
             db         'dos             '
             db         'vax             '

data ends

code segment
  start:         mov ax,data
                 mov ds,ax
         
         mov bx,0
   

         mov cx,4
   
upRow:          mov dx,cx
                mov cx,3
                mov si,0               
         
change:            mov al,ds:[bx+si]
                and al,11011111B
        mov ds:[bx+si],al
        inc si
        loop change
  
  
               mov cx,dx
               add bx,16
               loop upRow

         
         mov ax,4C00H
         int 21H


code ends

end start

编程,将data段中的每个单词的前四个字母都改成大写

assume cs:code,ds:data,ss:stack

data segment
                     ;0123456789ABCDEF
              db     '1. display      '
              db     '2. prows        '
              db     '3. replace      '
              db     '4. modify       '
data ends

stack segment  
          dw    0,0,0,0
          dw    0,0,0,0
          dw    0,0,0,0
          dw    0,0,0,0
stack ends

code segment
start:                            mov ax,stack
                                  mov ss,ax
                                  mov sp,32
                                  
                                  mov ax,data
                                  mov ds,ax
                  
                  mov bx,0
                  
                  mov cx,4
                  
upRows:                      push cx
                  mov cx,4
                  mov si,0
                  
upletter:                         mov al,ds:[bx+si+3]
                  and al,11011111B
                  mov ds:[bx+3+si],al
                  inc si
                  loop upletter
                  
                  pop cx
                  add bx,16
                  loop upRows
                  
                  

                  mov ax,4C00H
                  int 21H
         
code ends
end start


                                                    

总结:我们应该合理安排数据,方便我们存取和使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值