[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]

定位内存地址的方法(也称为寻址方式)

寻址方式的适当应用,使我们可以以更合理的结构来看待所要处理的数据,而为所要处理的看似杂乱的数据设计一个清晰的数据结构是程序设计的一个关键的问题
《汇编语言》第三版 160页

[idata]       常量表示地址,直接定位
[bx]          变量表示地址,间接定位
[bx+idata]    变量和常量,起始地址用变量间接定位 
[bx+si]  
[bx+si+idata]

问题7.6 : 编程,将dataseg段中的每个单词的头一个字母改为大写字母

assume cs:codesg,ds:datasg

datasg segment
    db  '1. file         '
    db  '2. edit         '
    db  '3. search       '
    db  '4. view         '
    db  '5. options      '
    db  '6. help         '
datasg ends

codesg segment
    start:  mov ax,datasg
            mov ds,ax
            mov bx,0
            
            mov cx,6
            s:  mov al,[bx+3]
                and al,11011111B
                mov [bx+3],al
                add bx,10H
                loop s
            
            mov ax,4c00H
            int 21H

        codesg ends
        end start
[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]_第1张图片
问题7.6 源数据.png
[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]_第2张图片
问题7.6 首字母大写.png
  • 首字母都在 第3个字符(从第0个开始数) ,使用 [bx+idata] 定位, idata=3

问题7.7 & 问题7.8:将段中的每个单词改为大写字母

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

datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax             '
datasg ends

stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg 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
            s0: 
                push cx
                mov si,0
                mov cx,3
                
            s:  mov al,[bx+si]
                and al,11011111B
                mov [bx+si],al
                inc si
                
                loop s
                
                add bx,10H
                pop cx
                loop s0
            
            mov ax,4c00H
            int 21H 
            
    codesg ends
    end start
[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]_第3张图片
使用G命令 一口气执行完全部指令.png
  • 需要暂存数据的时候,都应该使用
  • 栈顶偏移地址SP=8X2 计算,复习见 https://www.jianshu.com/p/03a175e6451a
  • 双层循环外层的循环次数cx的内容 压入 保存, push cx
  • 完成一次外层循环,弹出cx的内容pop cx

如果不保存外层循环次数,程序会无限LOOP

  • 不保存的情况下,可以使用【debug T命令】单步执行,并且可以在内层使用【debug P命令】跳过内层循环
  • 虽然程序可以完成全部字母大写的任务,但是程序会一直执行,此时对外层无法使用【debug P命令】跳过外层循环,也无法使用【debug g命令】一口气执行完全部指令,具体表现为光标一直闪烁,但是debug程序没有反应

问题7.9:将前四个字母改写成大写

[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]_第4张图片
dataseg中数据的存储结构.png
assume cs:codesg,ds:datasg,ss:stacksg

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
            s0: 
                push cx
                mov si,0
                mov cx,4
                
            s:  mov al,[bx+3+si]
                and al,11011111B
                mov [bx+3+si],al
                inc si
                
                loop s
                
                add bx,10H
                pop cx
                loop s0
            
            mov ax,4c00H
![dataseg中数据的存储结构.png](https://upload-images.jianshu.io/upload_images/10191360-7c87ee5c22a1418f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            int 21H 
            
    codesg ends
    end start
[030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata]_第5张图片
问题7.9 将前4个字母改为大写.png
  • 将前4个字母改为大写,相对dx的起始地址就是3,一共连续4个字母,通过si来遍历
  • mov al,[bx+3+si] , mov [bx+3+si],al 用于寻址

你可能感兴趣的:([030][汇编语言]问题7.6 7.7 7.8 7.9 寻址方式 [idata] [bx] [bx+idata] [bx+si] [bx+si+idata])