12.假设在内存BUF为首地址的数据区中,有50个字节的无符号数,编一程序能够找出数据块中的最大者,并把它送至MAX单元中。 stack1 segment stack db 1024 dup(0) stack1 ends data segment
buf db 10,1,2,3,4,5,6,7,8,9,10 ;假设一个数组,存放10个字节的无
符号数,其中头个数据表示元素个数
max db ? ;存放最大值 data ends code segment 'code' assume cs:code,ds:data,ss:stack1 start:mov ax,data
mov ds,ax ;设置ds指向程序数据段的段地址 lea si,buf mov cl,[si] ;取得元素个数 xor ch,ch
dec cx ;减1后是循环次数 add si,1
mov al,[si] ;取出第一个元素给al,al用于暂存最大值 maxck:add si,1 cmp [si],al ;与下一个数据比较 jle next
mov al,[si] ;al取得更大的数据 jmp next
next:loop maxck ;循环控制 mov maxay,al ;保存最大值 mov ax,4c00h
int 21h code ends end start
显示结果:
44.若在0500HD单元有一个数x,把次数的前四位变0,后四位维持不变,送回同一单元。
stack1 segment stack db 1024 dup(0) stack1 ends data segment org 0500h ;从0500h处存放数据 x db 64h data ends code segment 'code' assume cs:code,ds:data,ss:stack1
start:mov ax,data
mov ds,ax ;设置ds指向程序数据段的段地址 mov al,x ;将x存放在al中
and al,0fh ;将al前四位清零,后四位不变 mov si,0500h ;将 0500h存放在si中 mov [si],al ;将al存放在0500h处 mov ax,4c00h int 21h code ends end start 显示结果:
81.编写子程序。用给定的字节(在AL中)填充一指定的内存区域。该内存区域的起始地址位于DI中,需填充的内存单元个数位于CX中。主程序调用子程序实现上述功能。
stack1 segment stack db 1024 dup(0) stack1 ends data segment
buf db 100 ;字节变量用于填充指定的内存区域
org 0200h ;从指定的内存区域的起始地址安排数据 string db 10 dup(?) ;指定的内存区域
data ends code segment 'code' assume cs:code,ds:data,ss:stack1 start:mov ax,data
mov ds,ax ;设置ds指向程序数据段的段地址 mov al,buf ;将给定的数据x存放在al中 mov di,offset string ;di指向指定内存区开始 mov cx,sizeof string ;汇编结果mov cx,10 call dpchar ;调用子程序
mov ax,4c00h
int 21h ;程序结束点,返回dos dpchar proc ;过程定义,过程名为dpchar push ax ;顺序入栈,保护寄存器 push di push cx
again: mov [di],word ptr al ;将x填充在0200h处 inc di ;di加1 loop again ;循环控制 pop cx pop di
pop ax ;恢复被改变的寄存器值 ret ;子程序返回 dpchar endp ;过程结束
code ends end start 显示结果:
因篇幅问题不能全部显示,请点此查看更多更全内容