王爽《汇编语言》第10章 实验10 编写子程序

来源:互联网 发布:dos 网络映射命令例子 编辑:程序博客网 时间:2024/05/20 19:47
花了三个多小时写出来的东西,真费劲。。。接下来就是本书的两个课程设计之一。
assume cs:codedata segment  db 'Welcome to masm!',0data endsnumberdata segment  dw 123,12666,1,8,3,38numberdata endscode segmentstart:  ;测试显示函数  mov dh,8  mov dl,3  mov cl,2  mov ax,data  mov ds,ax  mov si,0  call show_str    ;测试除法  mov ax,0FFFFH  mov dx,0FFFFH  mov cx,0FH  call divdw    ;测试数据转字符  mov ax,data  mov ds,ax  mov si,0  mov ax,numberdata  mov es,ax  mov ax,es:[0]  call dtoc    mov ax,4c00h  int 21hdtoc: ;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符      ;参数:(ax)=word型数据      ;      ds:si指向字符串首地址 (‘0’:30H,‘9’:39H)       push bx      push cx      push si              mov dx,0    k:        mov cx,ax      jcxz r      mov cx,10           call divdw      mov bx,30H      add bx,cx      mov ds:[si],bx      inc si      loop k    r:      pop si      pop cx      pop bx        ret            divdw: ;功能:进行不会产生溢出的除法运算,被除数为dword型       ;      除数为word型,结果为dword型       ;参数:(ax)=dword型数据的低16位       ;      (dx)=dword型数据的高16位       ;      (cx)=除数       ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数       push bx       push dx       push di       push si       ;先算00ax/cx商si余数di,再算00dx/cx商bx余数为dx,然后算dxdi/cx余数dx             mov bx,dx       mov dx,0       div cx       mov di,dx;余数最大为cx-1       mov si,ax;商最大为 0000 FFFF              mov ax,bx       mov dx,0       div cx   ; bx00/cx       mov bx,ax;商最大为 0000 FFFF                ;余数dx最大为 cx-1              mov ax,di       div cx   ; dxdi/cx         add si,ax;商最大为 0000 FFFF, si不可能溢出              mov cx,dx       mov dx,bx       mov ax,si              pop si       pop di       pop dx       pop bx       ret  show_str: ;功能: 在指定的位置,用指定的颜色,          ;       显示一个用0结束的字符串          ;参数: (dh)=行号(0~24),(dl)=列号(0~79),          ;       (cl)=颜色,ds:si字符串首地址          ;返回:无        push ax        push bx        push cx        push dx        push es        push si                ;确定输出第一个偏移位置bx        mov ax,0B800H        mov es,ax        mov al,dh        mov ah,160        mul ah        mov dh,0        add ax,dx        add ax,dx        mov bx,ax              mov ah,cl ;颜色保存在高位        mov ch,0              s:          mov cl,ds:[si]        jcxz ok         mov al,cl        mov es:[bx],ax        add bx,2        inc si        jmp short s      ok:        pop si        pop es        pop dx        pop cx        pop bx        pop ax        ret  code endsend start

原创粉丝点击