3、源程序 ①附加题
data segment count equ 256 data ends
stack segment stack 'stack' buf db 20 dup(?) stack ends
code segment assume cs:code,ds:data,ss:stack start:mov ax,data mov ds,ax xor al,al mov cx,count
zrbh: mov bh,16
next:call disp ;输出字符 push ax ;入栈保护 push bx call space ;输出空格 pop bx ;出栈恢复 pop ax inc al ;自增 dec bh ;自减 jnz loop1 ;如果输出个数还不是16的倍数 push ax push bx call cr ;输出回车、换行 pop bx pop ax mov bh,16 ;重新设置bh loop1: loop next mov ah,4ch int 21h
disp proc near ;显示字符子程序
mov dl,al ;在调用之前先把要显示的字符送入al mov ah,2 int 21h ret disp endp
space proc near mov dl,20h mov ah,2 int 21h ret space endp
cr proc near mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h ret cr endp code ends end start
②习题4.1
data segment org 100h ;设置256个单元的起始地址偏移量为0100h buf1 db 256 dup(?) ;buf1的偏移量为0100h count equ $-buf1 ;得到buf1的长度 data ends stack segment stack 'stack' stack ends code segment assume cs:code,ds:data,ss:stack
start:mov ax,data ;data=076Ah,数据段基址 mov ds,ax mov si,offset buf1 ;si=0100h mov cx,count ;循环计数 xor al,al ;al清零,初始化为00h
next:mov [si],al ;将al存储到ds*4+si=077A0h inc al ;al加一
inc si ;si加一 loop next ;循环 mov ah,4ch ;程序结束 int 21h code ends end start
③习题4.2
data segment org 100h ;设置256个单元的起始地址偏移量为0100h buf1 db 256 dup(?) ;buf1的偏移量为0100h count equ $-buf1 ;得到buf1的长度 data ends stack segment stack 'stack' stack ends code segment assume cs:code,ds:data,ss:stack
start:mov ax,data ;data=076Ah,数据段基址 mov ds,ax mov si,offset buf1 ;si=0100h mov cx,count ;循环计数 xor al,al ;al清零,初始化为00h
next:mov [si],al ;将al存储到ds*4+si=077A0h inc al ;al加一 inc si ;si加一 loop next ;循环 xor bx,bx ;bx置零,bl和bh分别存放正、负元素的个数 xor dh,dh ;dh寄存器存放0元素的个数 mov si,offset buf1 ;重新将si指向buf1首地址 mov cx,count ;重新设定计数器
next2: mov al,[si] ;将当前si对应位置的数据赋给al cmp al,0 ;比较al与0的大小,有符号数的比较参见笔记5.2.2 jg plus ;正数 jl negat ;负数 jmp zero ;0
zero:inc dh ;0的个数加一 jmp next3
negat: inc bh jmp next3
plus: inc bl
next3: inc si loop next2 mov [si],dh inc si mov [si],bx mov ah,4ch int 21h code ends end start
;负数的个数加一
;正数的个数加一
;修改地址指针si
;循环
;下移一个单元 ;程序结束
④习题4.3
data segment org 100h ;设置256个单元的起始地址偏移量为0100h
buf1 db 259 dup(?) ;buf1的偏移量为0100h,256个单元存放数据,3个单元存放结果 count equ $-buf1 ;得到buf1的长度 data ends
stack segment stack 'stack' stack ends
code segment assume cs:code,ds:data,ss:stack
start:mov ax,data ;data=076Ah,数据段基址 mov ds,ax mov si,offset buf1 ;si=0100h mov cx,count-3 ;循环计数 xor al,al ;al清零,初始化为00h
next1: mov [si],al ;将al存储到ds*16+si=077A0h inc al ;al加一 inc si ;si加一 loop next1 ;循环 xor bx,bx ;bx置零,bl和bh分别存放正、负元素的个数 xor dh,dh ;dh寄存器存放0元素的个数

