王爽第三版汇编 实验题 实验(七 )

在这里插入图片描述

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
s0:
	push cx//将cx压入栈保存
	mov cx,4
	mov si,4	
s1:
	mov al,[bx+si]
	and al,11011111b//对字符变大写
	mov [bx+si],al
	inc si
loop s1
	add bx,16
	pop cx//恢复cx
loop s0
codesg ends
end start

在这里插入图片描述
将 字符 第四个和后面四个字节 变成大写
在这里插入图片描述

寻址 的 寄存器
8086 cpu 能使用的四个寻址寄存器 si,di,bx,bp
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验七

寻址方式在结构化数据访问中的应用

assume cs:codesg,es:tablesg,ss:stacksg
data segment
datasg segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
    db '1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980,590827
    dd 803530,1183000,1843000,2759000,3753000,4649000,5937000
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
    dw 11542,14430,15257,17800
datasg ends
tablesg segment
                db 21 dup ('year summ ne ?? ')
tablesg ends
stacksg segment
                dd 0,0,0,0
stacksg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,4h
mov ax,tablesg
mov es,ax
mov di,0
mov bx,0
mov cx,21
s0:
        mov ax,4
        mul di 
        push di//保存到 寄存器 后面再恢复
        mov di,ax // 由于年份 每次加四个字节 所以 公式是 di*4
        push dword ptr [di+0] //数据段 + 字段  定位  压入 4个字节
        pop dword ptr es:[si+0] // 弹出4个字节附加寄存器指向要写入的table si指向第几条 数据 0指向第几个字段开始处
        pop di //将di恢复 
        mov ax,4 //同上
        mul di
        push di
        mov di,ax
   		push dword ptr [di+84] //总共21年每个字段占 4个字节 21 * 4 = 84 所以收入其实地址 就是 84 di用来控制第条收入 
        pop dword ptr es:[si+5]
        pop di
        mov ax,2
        mul di
        push di
        mov di,ax
        push [di+168]
        pop es:[si+10]
        pop di
        mov dx,es:[si].7 //dx高位 存放让在内存高地址
        mov ax,es:[si].5 //低位存放在低地址
        mov bx,es:[si].10 //除数 上面2个是被除数
        div bx //对 dx,ax做除法
        mov es:[si+13],ax // ax存放商 dx存放余数 取出余数写入 es表段的第si条数据的第 13个字节处
        inc di
        add si,16 //每家16就是 下一条数据开始地址
loop s0
mov ax,4c00h
int 21h
codesg ends
end start

以上只用了一个循环,通过计算出各个字段之间的间隔 进行段寻址啊,这里遇到一点坑。
就是 ds 和es[si +0dh] 寄存器里不能用十六进制 并且 mov dword ptr es:[si+数字],[di+数字] 好像2个段之间不能直接进行数据拷贝 所以改成了 拿到 ds数据 压栈 再 出栈给 es段寄存器处。

在这里插入图片描述
上面是 ds段的数据 下面是经过程序运行后 复制计算出来的数据

在这里插入图片描述

发布了85 篇原创文章 · 获赞 5 · 访问量 4716

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/104183563