函数 在右括号外写函数,关键字proc 和 endp配对,在结束前返回用ret。
abc proc ...... ret abc endp显示字符‘A’的函数。
abc proc ;cl是入口参数 mov dl,cl ;'A',也可以,但是由于更改时不易,可以用cl做入口参数,在主函数中将A赋给cl mov ah,2 int 21h ret abc endp ;在主函数中: mov cl,'A' call abc ;输出结果:A1、编写子程序output,将AX中的数以无符号十进制形式输出显示。(如果有入口参数或出口参数,请给出相应注释进行说明。)
output proc ;output函数 ;以ax作为入口参数 push bx push cx push dx mov cl,10 mov ch,0;计数 divagain: div cl push ax add ch,1 mov ah,0 cmp ax,0 je divover jmp divagain divover: cmp ch,0 je outputover pop bx mov dl,bh add dl,48 mov ah,2 int 21h sub ch,1 jmp divover outputover: pop dx pop cx pop bx ret output endp ;主函数中: mov ax,12 mov bx,123 mov cx,1234 call output ;输出12 mov ax,bx call output ;如果在函数中没有将用到的寄存器入栈,则在疏输出的函数中bx已经被修改过,需要在执行之前将寄存器入栈,再在返回之前出栈 ;输出123 mov ax,cx call output ;输出12342、编写子程序input,从键盘输入数字字符(例如‘1’‘2’‘6’‘a’),在程序中得到对应的数值(126)。(如果有入口参数或出口参数,请给出相应注释进行说明。)
;输入函数 input proc ;出口参数为bx push ax push cx push dx mov ch,10 mov bx,0 inputagain: mov ah,1 int 21h cmp al,'0' jb inputover cmp al,'9' ja inputover sub al,48 mov dl,al mov dh,0 mov al,bl mul ch add ax,dx mov bx,ax ;结果存在bx中 jmp inputagain inputover: pop dx pop cx pop ax ret input endp ;主函数 ;input的主函数 mov cx,789 call input mov ax,bx call output ;输入123a,输出123 ;在键盘输入显示后,要再次显示cx的值 mov ax,cx call output ;由于在output和input中更改了cx的值,输出的并不是cx的值,所以应该在执行input之前将用到的寄存器入栈保存数据,在返回前出栈,但是保存结果的寄存器不入栈 ;输入:123a ;输出结果:123789DATAS SEGMENT a0 byte 5 a1 byte 12,125,6,234,123 a2 word 18 a3 word 12,5,6,567,123 a4 word 5 dup (?) a5 byte ‘Please input 5 data:!’ a6 byte ‘5 data before sort is:!’ a7 byte ‘5 data after sort is:!’ a8 byte 13,10,’!’ DATAS ENDS 根据以上数据定义,完成下列题目: 3、利用1题中的子程序,将a2中的数据输出显示。
;显示a2中的一个数据 mov si,offset a2 mov ax,[si] ;注意这里取的是两个字节,word,将结果存在16位寄存器中 call output ;输出结果:184、 利用1题中的子程序,将a3中的5个数据输出显示。
;显示a3中的5个数据 mov cx,0;计数 mov si,offset a3 aaaaa: cmp cx,5 je aaaover mov ax,[si] ;输出两个字节word call output mov dl,' ' mov ah,2 int 21h add si,2 add cx,1 jmp aaaaa aaaover: ;输出结果: 12 5 6 567 1235、利用2题中的子程序,输入5个数据,存放到a4变量中,并显示出来。
;输入5个数据存放到 a4中,并显示出来 mov cx,0 mov si,offset a4 LA: cmp cx,5 je over call input mov [si],bx add si,2 add cx,1 jmp LA over: ;显示出来 mov cx,0 mov si,offset a4 LLL: cmp cx,5 je overrrr mov ax,[si] call output mov dl,' ' mov ah,2 int 21h add si,2 add cx,1 jmp LLL overrrr: ;输入:1a2a3a4a5a ;输出结果:1 2 3 4 56、编写子程序dispstr,将以叹号结尾的字符串输出显示。(如果有入口参数或出口参数,请给出相应注释进行说明。)
;输出字符串,以“!”结尾 dispstr proc ;si做入口参数 push ax push dx dispagain: mov dl,[si] cmp dl,'!' je dispover mov ah,2 int 21h add si,1 jmp dispagain dispover: pop dx pop ax ret dispstr endp7、利用6题中的子程序,在主程序中将a5-a7中的字符串输出显示。
;输出字符串a5-a7 mov si,offset a5 call dispstr mov si,offset a6 call dispstr mov si,offset a7 call dispstr