第十章

来源:互联网 发布:炒黄金手机软件 知乎 编辑:程序博客网 时间:2024/04/27 14:19
 

检测点10.1

第一空:1000

第二空:0000

检测点10.2

ax=6

注意: 执行call s是ip的值为6 接着进栈,然后执行pop ax  相当于把ip的值放到ax中!!

检测点10.3

ax=1100H

注意:执行callfar ptr s后 cs=1000 ip=3(10H)接着进栈 然后执行pop ax 此时ax=3

==〉add ax,ax此时ax=6(100H)==〉pop bx 此时bx=1000 ==〉add ax,bx此时ax=1100H

检测点10.4

ax=000B   具体我就不一一分析了,呵呵!!

检测点10.5

(1)

   ax=3

(1)ax=1         bx=0

实验十:编写子程序

(1)显示字符串

;*******************************************************************

;显示字符串的子程序 (dh)= 行号(取值范围0-24),(dl)=列号(取值范围0-79)

;(cl)=颜色,ds:si指向字符串的首地址

;********************************************************************

assume cs:code,ds:data,es:display,ss:stack

data segment

   db 'welcome to masm!',0

data ends

stack  segment

   db  8 dup(0)

stack ends 

display segment

   db 1024 dup(0)

display ends

code segment

start:

     mov dh,8

     mov dl,3

     mov cl,2

     mov ax,data

     mov ds,ax

     mov si,0

     call show_str

     mov ax,4c00h

     int 21h

;*****************************************

;显示字符串的子程序

;*****************************************

show_str:

     push cx

     push si

     mov ax,0B800H

     mov es,ax

     mov al,0a0h

     dec dh

     mul dh

     mov bx,ax

     mov al,2

     mul dl

     sub dl,2

     add bx,ax                   ;得到偏移地址=(dh-1)*160+dl*2-2

     mov di,0

     mov ch,0

     mov al,cl

    s: 

     mov cl,ds:[si]

     jcxz next                ;进行判断最后一个字符是否是零,如果是零则结束

     mov es:[bx+di],cl        ;将字符串放到偶地址中

     mov es:[bx+di+1],al      ;颜色属性放到奇地址中

     add di,2 

     inc si 

     jmp s

next:

   pop si

   pop cx

   ret

code ends

     end start

注意:子程序中用到的寄存器一定要将其保存起来,注意参数的传递!!!,只要程序中要进栈和出栈,就一定要定义堆栈段!!!!

2.解决除法溢出问题

    

 

     

;*****************************************************************

;解决除法溢出问题,

;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数

;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

;*****************************************************************

assume cs:code,ss:stack

stack segment

  dw 8 dup(0)

stack ends

code segment

start:

        mov ax,stack

        mov ss,ax

        mov sp,10h

        mov ax,4240h

        mov dx,0fh

        mov cx,0ah

        call divdw

        mov ax,4c00h

        int 21h

divdw:                        ;子程序定义开始

        push ax

        mov ax,dx

        mov dx,0

        div cx

        mov bx,ax

        pop ax

        div cx

        mov cx,dx    

        mov dx,bx          ;dx:ax/cx=高位的商*65536+[高位的余数*65536+低位]/cx        

        ret                ;子程序定义结束

code ends

end start

3.数值显示子程序 

 

 

;**********************************************

;数值显示子程序

;编程,将data段中的数据以十进制的形式显示出来

;**********************************************

assume cs:code,ds:data

data segment

   db 10 dup(0)

data ends

code segment

start:

   mov ax,12666

   mov bx,data

   mov ds,bx

   mov si,0

   call dtoc

   mov dh,8

   mov dl,3

   mov cl,2

   call show_str

   mov ax,4c00h

   int 21h

;******************************************************

;将word型的数据转变为十进制数字符串的子程序

;****************************************************

dtoc:

   push ax

   push si

   push dx

   push cx

   push bx

   mov bx,0

   

s0:

   mov cx,10d

   mov dx,0

   div cx

   mov cx,ax                            ;将商放到cx中判断商是否为零

   jcxz s1

   add dx,30h

   push dx

   inc bx 

   jmp s0

s1:

  add dx,30h

  push dx 

  inc bx

  mov cx,bx

  mov si,0

s2:

  pop ax

  mov ds:[si],al

  inc si

  loop s2

  pop bx

  pop cx

  pop dx

  pop si

  pop ax

  ret

;***********************************************************

;显示字符串子程序

;***********************************************************

show_str:

     push bx

     push cx

     push si

     mov al,0a0h

     dec dh

     mul dh

     mov bx,ax

     mov al,2

     mul dl

     sub ax,2

     add bx,ax                   ;得到偏移地址=(dh-1)*160+(dl-2)*2

     mov ax,0B800H

     mov es,ax

     mov di,0

     mov ch,0

     mov al,cl

    s: 

     mov cl,ds:[si]

     jcxz next                ;进行判断最后一个字符是否是零,如果是零则结束

     mov es:[bx+di],cl        ;将字符串放到偶地址中

     mov es:[bx+di+1],al      ;颜色属性放到奇地址中

     add di,2 

     inc si 

     jmp  short s

next:

   pop si

   pop cx

   pop bx

   ret

code ends

  end start