实验2 多个逻辑段的汇编源程序编写与调试
16*⌈N/16⌉(向上取整)
只有task_4可以运行。不写 start,程序从头开始执行。写了 start,程序从 start:标号处开始执行。上述4个任务只有task4是已代码段开头的,所以程序仍能运行,其他则会出错。
代码实现:
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 data2 ends data3 segment db 16 dup(0) data3 ends code segment start: mov ax,data1 mov ds,ax mov bx,0 mov cx,10 s:mov ax,[bx] add ax,[bx+16] mov [bx+32],ax inc bx loop s mov ah,4ch int 21h code ends end start
调试:
data1 data2相加后结果成功保存在data3中
代码实现:
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends code segment start: mov ax,data1 mov ds,ax mov ax,data2 mov ss,ax mov sp,16 mov cx,8 mov bx,0 s:push [bx] add bx,2 loop s mov ah, 4ch int 21h code ends end start
成功将data1中的八个字段逆序存储到逻辑段b中。
0DFh(1101 1111) 相与后al第三位变为0,相当于-32,在程序中的作用为将大写字母变为小写
由此可知 这些数值用于改变颜色。
代码实现:
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov cx,4 s:mov ax,[bx] or ax,20h mov [bx],ax add bx,16 loop s mov ah, 4ch int 21h code ends end start
调试:
成功将每一行单词首字母从大写转为小写
代码实现:
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov bp,0 mov cx,5 y:mov ax,[bx] mov es:[bp],ax mov ax,[bx+2] mov es:[bp+2],ax add bx,4 add bp,16 loop y mov bp,5 mov cx,5 i:mov ax,[bx] mov es:[bp],ax add bp,16 add bx,2 loop i mov bp,10 mov cx,5 p:mov ax,[bx] mov es:[bp],ax add bp,16 add bx,2 loop p mov bp,5 mov cx,5 a:mov ax,es:[bp] mov bl,es:[bp+5] div bl mov es:[bp+8],al add bp,16 loop a mov ah, 4ch int 21h code ends end start
调试:
成功将data中的数据按要求结构化到逻辑段table中