汇编语言王爽第五部分(数据处理)
汇编数组
将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].