汇编实验10


;实验一显示字符串
assume cs:code,ds:data data segment db
'welcome to masm!',0 data 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: mov bx,0b800h //显示区 mov es,bx sub dh, mov al,160 mul dh //行存放在ax中 mov di,ax sub dl,1 mov al,2 mul dl //列的位置 add di,ax //最终的位置放在di中 mov dh,cl //属性存放在dh中,为了ok判断cx是否为0 s: mov cl,ds:[si] mov ch,0 mov dl,cl //低位存放字母 mov es:[di],dx inc si add di,2 jcxz ok loop s ok: ret code ends end start

  

 实验二:除法溢出

  

;首先要说明的是这个公式的作用,int(H/N)存放最终结果的高位。
;低位是在用高位除法后的余数左移16位参与低位的运算之中,其
;低位商存于ax之中,余数复赋值给cx,再把之前高位商赋值给dx
;即可(不知道为什么刚开始没定义stack会RE,stack也会溢出)
assume cs:code,ss:stack

stack segment
    dw 16 dup(0)
stack ends

code segment
    start:
        mov ax,4240H
        mov dx,000FH
        mov cx,0AH

        mov bx,stack
        mov ss,bx
        mov sp,16

        call divdw
divdw:
        push ax
        mov ax,dx
        mov dx,0
        mov cx,10
        div cx
        mov cx,ax   ;高位商
        pop ax      ;低位数字
        push cx     ;余数直接就在dx参与下面的运算

        mov cx,10
        div cx      ;ax就是最终商

        mov cx,dx   ;最终余数
        pop dx
        ret
code ends
end start

  

  

  

  结果正确

  

 实验三:把data段的数据以十进制的形式显示出来

  

assume cs:code,ds:data

data segment
    dw 123,12666,1,8,3,38
data ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov si,12
        mov cx,6
        mov bx,0
    transfer_all:
        mov ax,ds:[bx]
        call dtoc
        add bx,2
        call next_word
        loop transfer_all

        mov si,12
        mov dh,8
        mov dl,20
        mov cx,6

    show_all:
        push cx
        mov cl,2
        call show_str

        call next_word
        inc dh
        pop cx
        loop show_all

        mov ax,4c00h
        int 21h

dtoc proc near
        push bx
        push dx
        push cx
        push ax
        push si
        mov bx,0
    decimal_change:
        mov dx,0
        mov cx,10
        div cx
        add dx,30h
        push dx
        inc bx
        cmp ax,0
        jne decimal_change
        mov cx,bx
    transfer:
        pop dx
        mov [si],dl
        inc si
        loop transfer
        mov ax,0
        mov [si],al
        pop si
        pop ax
        pop cx
        pop dx
        pop bx
        ret
dtoc endp

next_word proc near
        push ax
    zero_or_not:
        mov ax,[si]
        mov ah,0
        cmp ax,0
        je end_of_num
        inc si
        jmp zero_or_not
        end_of_num:
        inc si
        pop ax
        ret
next_word endp

show_str proc near
        push ax
        push es
        push dx
        push di
        push si
        mov ax,0b800h
        mov es,ax
        mov al,0a0h
        mul dh
        mov di,ax
        mov al,2
        mul dl
        add di,ax

    s:  mov ax,ds:[si]
        mov es:[di],ax
        inc di
        mov es:[di],cl
        inc si
        push cx
        mov cx,ds:[si]
        mov ch,0

        jcxz end_show
        pop cx
        inc di
        jmp s
        end_show:
        pop cx

        pop si
        pop di
        pop dx
        pop es
        pop ax
        ret
show_str endp

code ends
end start

  

 

posted @ 2017-06-02 17:23  cs的蜗牛  阅读(213)  评论(0编辑  收藏  举报