汇编数组
将datasg中的第一个字符串转为大写,将第二个字符串转为小写
assume cs:code,ds:datasg
datasg segment
db 'BaSic'
db 'MinIx'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:
mov al,[bx+0]
and al,11011111b;与
mov [bx+0],al
mov al,[bx+5]
or al,00100000b;或
mov [bx+5],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
第一个字符串地址是从段地址为ds,偏移地址为0开始的5个字节
第二个字符串地址是从段地址为ds,偏移地址为5开始的5个字节
将第六位取0是大写字母
将第六位取1是小写字母
与C语言的数组类似
C语言a[i],b[i]
汇编语言:[bx+0],[bx+5]或者0[bx],5[bx]
汇编结构体
编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存到table段中
代码初始化
首先初始化栈段,数据段,table段
assume cs:code,ss:stacksg,ds:datasg,es:table
stacksg segment
db 16 dup(0)
stacksg ends
datasg segment
a db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
b dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
dd 5937000
c 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
table segment
db 21 dup('year summ ne ?? ')
table ends
初始化DS,SS,SP
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,table
mov es,ax
因为懒得数数,所以在datasg数据前面用了a,b,c标识符
下面是将数据复制到table段行地址0-3和5-8
mov si,0
mov bx,0
mov di,0
mov cx,21
s:
mov si,0
push cx
mov cx,4
s0:
mov al,a[di]
mov es:[bx+si],al;复制到table段
mov al,[offset b+di]
mov es:[bx+si+5],al;复制到table段
inc di
inc si
loop s0
add bx,10h
pop cx
loop s
只要知道这个原理,其他的都一样
与C语言的结构体类似
typedef struct
{
char Year[4];
char NO_Data;
unsigned int sunm
char NO_Data;
unsigned short People
char NO_Data;
unsigned short People_AVR
char NO_Data;
}company
定义21个company
company Mycompany[21]
原理:获得数据的首地址然后用si,di,或者bx进行偏移.
比如要访问Mycompany[10]中的sunm的第三个元素,可以把bx设置为16*10,sunm偏移了6个字节,si为0-3,分别表示sunm的1-4位,一个Mycompany大小为16个字节,所以可以表示为[bx+si+5].