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段的数据 下面是经过程序运行后 复制计算出来的数据