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


实验

编程1 将datasg段中每个单词的前四个字母改为大写字母

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,16;初始化栈段
    
    mov ax,datasg
    mov ds,ax;初始化数据段
    
    mov bx,0
    mov cx,4
s:
    push cx
    mov cx,4
    mov si,0
s0:
    mov al,ds:[bx+3+si];这个地方必须要是 bx+(si/di)+(idata)这样的形式,()为可选内容
    and al,11011111B;01100100 01000100--44  
    mov ds:[bx+3+si],al

    inc si
    loop s0

    pop cx
    add bx,16
    loop s
    
    mov ax,4c00h
    int 21h

codesg ends

end start

运行截图

出现的错误

  • and al,11011111b少打了一个1

编程2 将datasg中的第一个字符串转换成大写,第二个字符串转成小写

assume cs:codesg,ds:datasg

datasg segment
    db 'BaSiC'
    db 'iNfOrMaTiOn'
datasg ends

codesg segment
    start:
        mov ax,datasg
        mov ds,ax
        
        mov bx,1
        mov cx,2
    s:
        mov al,ds:[bx]
        and al,11011111b
        mov ds:[bx],al

        add bx,2
        loop s
        
        mov bx,6;这个bx要定位到 第二个字符串的第一个大写字母啊
        mov cx,5

    s0:
        mov al,ds:[bx]
        or al,00100000b
        mov ds:[bx],al
        
        add bx,2
        loop s0

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

运行截图

出现的错误

  • 第二个字符串定位是要在第一个大写字母N

编程3 用si和di实现将字母串”welcome to masm!”复制到它后面的数据区中

assume  cs:codesg,ds:datasg

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

codesg segment

start:
    mov ax,datasg
    mov ds,ax

    mov si,0
    mov di,10h

    mov bx,0
    mov cx,8 

s: 
    mov ax,ds:[bx+si]
    mov ds:[bx+di],ax
    
    add si,2
    add di,2
    
    loop s

    mov ax,4c00h
    int 21h


codesg ends

end start

运行截图

出现的错误

  • assume codesgcode segment 不匹配
  • di寄存器写成bi

总结

这一章中,我们主要讲解了更为灵活的寻址方式的应用和一些编程方法,主要的内容有:

  • 寻址方式 [bx]–编程2[bx+idata] [bx+si]–编程3[bx+si+idata]–编程1
  • 二重循环问题的处理,处理两个循环loop都使用cx寄存器的时候,会出现冲突的问题.解决的最佳方式就是将cx的值暂时存储到栈空间中,等到再次回到外层循环的时候,再将其出栈,以此实现将互不影响.这里也能体现处在调用函数掉用被调用函数的时候,将各个寄存器的值入栈,等到被调用函数返回时,再将各个寄存器的值初始化到调用被调用函数之前,这样就可以继续执行调用函数,而不产生影响.
  • 栈的应用
  • 大小写转换的方法
    小写转大写 and al,11011111b
    大写转小写 or al,00100000b
  • and | or 指令

文章作者: 美食家李老叭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 美食家李老叭 !
评论
  目录