• Assembly Exp


    Exp 2.1=====================================

    assume cs:code
    code segment
    main proc far
    start:
    push ds
    sub ax,ax
    push ax

    ;mov ax,data
    ;mov ds,ax

    mov cx,5h ;num of lines
    mov bx,10h ;initialize

    B: push cx
    mov cx,10h ;num of columns


    A: mov ah,02h
    mov dl,bl
    int 21h
    mov ah,02h
    mov dl,0h
    int 21h
    inc bl
    loop A

    mov ah,02h
    mov dl,0dh
    int 21h
    mov ah,02h
    mov dl,0ah
    int 21h

    pop cx
    loop B


    ret
    main endp
    code ends

    end start

    Exp 2.2=====================================

    maxchars equ 50


    stack segment

    dw 100 dup(?)
    se label word

    stack ends

    data segment

    pos dw ?

    s1 db 'Enter keyword:','$'
    s2 db 0dh,0ah,'Enter Sentence:','$'
    sM db 0dh,0ah,'Match.','$'
    sNM db 0dh,0ah,'No match.','$'

    maxKeys db maxchars
    actKeys db ?
    bufferKeys db maxchars dup(?),?

    maxSen db maxchars
    actSen db ?
    bufferSen db maxchars dup(?),?



    data ends

    code segment

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

    main proc far

    start:
    push ds
    sub ax,ax
    push ax

    mov ax,data
    mov ds,ax
    mov es,ax
    mov ax,stack
    mov ss,ax
    lea sp,se

    ;======================================

    mov ah,9 ;display string s1
    lea dx,s1
    int 21h

    lea dx,maxKeys ;get key words
    mov ah,0ah
    int 21h

    mov ah,9 ;display string s2
    lea dx,s2
    int 21h

    lea dx,maxSen ;get sentence
    mov ah,0ah
    int 21h

    mov al,actSen ;if actSen < actKeys go to NoMatch
    sub al,actKeys
    jb NoMatch

    inc al
    lea si,bufferKeys
    lea di,bufferSen
    mov bx,di
    cli
    mov ch,0
    mov cl,al


    s: push cx
    mov ch,0
    mov cl,actKeys
    repz cmpsb

    cmp cx,0
    jz Match

    lea si,bufferKeys

    inc bx
    mov di,bx

    pop cx
    loop s


    NoMatch:mov ah,9 ;display string sNM
    lea dx,sNM
    int 21h

    jmp gun

    Match:
    sub bx,offset bufferSen
    mov pos,bx

    mov ah,9 ;display string sM
    lea dx,sM
    int 21h

    ;======================================
    gun: ret
    main endp
    code ends

    end start



    例2.3

    ;result


    dataera segment
    grade dw 56,69,84,82,73,88,99,63,100,80
    s5 dw 0
    s6 dw 0
    s7 dw 0
    s8 dw 0
    s9 dw 0
    s10 dw 0
    dataera ends

    program segment

    main proc far

    assume cs:program,ds:dataera

    start:
    push ds
    sub ax,ax
    push ax


    mov ax,dataera
    mov ds,ax


    mov s5,0
    mov s6,0
    mov s7,0
    mov s8,0
    mov s9,0
    mov s10,0
    mov cx,10
    mov bx,offset grade

    compare:
    mov ax,[bx]
    cmp ax,60
    jl five
    cmp ax,70
    jl six
    cmp ax,80
    jl seven
    cmp ax,90
    jl eight
    cmp ax,100
    jne nine
    inc s10
    jmp short change_addr
    nine: inc s9
    jmp short change_addr
    eight: inc s8
    jmp short change_addr
    seven: inc s7
    jmp short change_addr
    six: inc s6
    jmp short change_addr
    five: inc s5
    change_addr:
    add bx,2
    loop compare
    ret

    main endp

    program ends

    end start


    Exp 2.4  ===========================================================


    stack segment
        
        dw 100 dup(?)
    se label word

    stack ends

    data segment
        name_buf db 21,0,21 dup(0)            ;buffer of typed name
        num_buf db 9,0,9 dup(0)                    ;buffer of typed number
        name_pos dw 0                                        ;record the next position of name in tel_tab
        num_pos dw 0                                        ;record the next position of number in tel_tab
        sort_flag db 0                                    
        sort_ax dw 0
        sort_bx dw 0
        tel_tab db 50 dup(20 dup('$'), '$',8 dup('$'),'$')
        
        sort_buf db 30 dup('0')                    ;used for exhanging data in tel_tab
        
        s1 db 0ah,'Input name:','$'
        s2 db 0dh,0ah,'Input a telephone number:','$'
        s3 db 0dh,0ah,'Do you want a telephone number?(Y/N)','$'
        s4 db 0dh,0ah,'name?','$'
        s5 db 0dh,0ah,'name            tel.',0dh,0ah,'$'
        return db 0dh,0ah,'$'
        spaces db 15 dup(' '),'$'
    data ends

    code segment

    assume cs:code,ds:data,ss:stack
    main proc far
    start:
        mov ax,data
        mov ds,ax
        mov es,ax
        mov ax,stack
        mov ss,ax
        lea sp,se

    ;=====================================

        mov name_pos,offset tel_tab
        mov num_pos,offset tel_tab+21

    t1:
        mov ah,9
        mov dx,offset s1
        int 21h
        
        call input_name
        cmp ax,1                            ;finish inputting name if 'Return' key pressed
        jz finish
        
        call stor_name
        
        mov ah,9
        mov dx,offset s2
        int 21h
        
        call inphone
        jmp t1

    finish:
        mov ax,name_pos
        sub ax,30
        cmp ax,offset tel_tab                    
        jz s                                                        ;if there is only one name,no need to sort
        call name_sort

    s:    
        mov ah,9
        mov dx,offset s3
        int 21h    


        mov dx,offset name_buf
        mov ah,0ah
        int 21h
        mov bx,offset name_buf+2
        mov al,byte ptr [bx]
        cmp al,'Y'

        jnz exit

    t2:    
        mov ah,9
        mov dx,offset s4
        int 21h        
        
        call input_name
        
        call name_search
        
        cmp ax,0
        jz t2                                    ;go back if no results found
        
        call printline
        
        jmp s
    exit:
    ;=====================================    
        mov ax,4c00h
        int 21h

    main endp

    input_name proc near
        mov dx,offset name_buf
        mov ah,0ah
        int 21h
        mov bx,offset name_buf+2
        mov al,byte ptr [bx]
        cmp al,0dh
        jz c1
        mov ax,0
        ret
    c1:
        mov ax,1
        ret
    input_name endp

    stor_name proc near
        mov bx,offset name_buf
        inc bx
        mov ch,0
        mov cl,[bx]
        mov si,offset name_buf+2
        mov di,name_pos
        rep movsb
        add name_pos,30                        ;increase the position of next name in tel_tab
        
        ret
    stor_name endp

    inphone proc near

        mov dx,offset num_buf
        mov ah,0ah
        int 21h
        
        mov bx,offset num_buf
        inc bx
        mov ch,0
        mov cl,[bx]
        mov si,offset num_buf+2
        mov di,num_pos
        rep movsb
        add num_pos,30                        ;increase the position of next number in tel_tab
        
        ret
            
    inphone endp

    printline proc near
        mov bx,ax
        mov ah,9
        mov dx,offset s5
        int 21h
        
        mov ah,9
        mov dx,bx    
        int 21h
        
        mov ah,9
        mov dx,offset spaces
        int 21h
        
        mov ah,9
        add bx,21
        mov dx,bx
        int 21h
        
        mov ah,9
        mov dx,offset return
        int 21h
        
        ret
    printline endp

    name_sort proc near        ;从最后一个开始的冒泡排序
        mov ax,name_pos
        
        sub ax,30                    ;save the last name's offset in ax
        mov bx,ax
        sub bx,30                    ;save the second to last name's offset in bx
        
        mov sort_ax,ax        ;save the last name's offset in sort_ax
        mov sort_bx,bx        ;save the second to last name's offset in sort_bx

    back:    
        mov si,ax
        mov di,bx
        
        cli
        
        mov cx,20
        
        repz cmpsb
        
        ja ns1                        ;don't need to exchange
        
        mov cx,30
        mov si,bx
        lea di,sort_buf
        rep movsb
        
        mov cx,30
        mov si,ax
        mov di,bx    
        rep movsb
        
        mov cx,30
        lea si,sort_buf
        mov di,ax    
        rep movsb
        
        mov sort_flag,1
    ns1:
        cmp bx,offset tel_tab                    ;to determine if it's the start of tel_tab
        jz judge
        
        sub ax,30
        sub bx,30
        

        jmp back
    judge:
        cmp sort_flag,0                                ;to determine if the sorting has been finished
        jz sort_over
        mov sort_flag,0
        

        mov ax,sort_ax
        mov bx,sort_bx
        
        
        jmp back
    sort_over:
        
        ret

    name_sort endp        

    name_search proc near
        mov ch,0

        cli
        lea di,tel_tab
        mov bx,di
    n1:
        mov cl,name_buf+1    
        lea si,name_buf
        add si,2
        repz cmpsb
        
        jz Match
        
        mov di,bx
        add di,30
        mov bx,di
        
        cmp byte ptr [di],24h
        jz NoMatch
        jmp n1
        

    NoMatch:
        mov ax,0    

        jmp gun

    Match:
        mov ax,bx        ;the offset of name found in tel_tab
        
    gun:    
        ret

    name_search endp

    code ends

    end start


    例2.7 =========================================================

    stacksg segment para stack 'stack'
    dw 32 dup(?)
    stacksg ends
    ;*************
    datasg segment para'data'

    hrspar label byte
    maxhlen db 6
    acthlen db ?
    hrsfld db 6 dup(?)

    ratepar label byte
    maxrlen db 6
    actrlen db ?
    ratefld db 6 dup(?)

    messg1 db 'Hours worked?','$'
    messg2 db 'Rate of pay?','$'
    messg3 db 'Wage ='
    ascwage db 14 dup(30h),13,10,'$'
    messg4 db 13,10,'Overflow!',13,10,'$'
    adjust dw ?
    binval dw 0
    binhrs dw 0
    binrate dw 0
    col db 0
    decind db 0
    mult10 dw 01
    nodec dw 0
    row db 0
    shift dw ?
    tenwd dw 10
    tempdx dw ?
    tempax dw ?
    datasg ends
    ;*******************************************
    codesg segment para 'code'
    ;__________________________________________________
    begin proc far
    assume cs:codesg,ds:datasg,es:datasg,ss:stacksg

    push ds
    sub ax,ax
    push ax

    mov ax,datasg
    mov ds,ax
    mov es,ax

    mov ax,0600h
    call q10scr
    call q20curs

    a20loop:
    call b10inpt
    cmp acthlen,0
    je a30
    call d10hour
    call e10rate
    call f10mult
    call g10wage
    call k10disp
    jmp a20loop
    a30:
    mov ax,0600h
    call q10scr
    ret
    begin endp
    ;---------------------------------------------------
    ;
    ;
    b10inpt proc near
    lea dx,messg1
    mov ah,09h
    int 21h
    lea dx,hrspar
    mov ah,0ah
    int 21h
    cmp acthlen,0
    jne b20
    ret
    b20: mov col,25
    call q20curs
    lea dx,messg2
    mov ah,09h
    int 21h
    lea dx,ratepar
    mov ah,0ah
    int 21h
    ret
    b10inpt endp
    ;------------------------------------------------------------

    d10hour proc near
    mov nodec,0
    mov cl,acthlen
    sub ch,ch
    lea si,hrsfld-1
    add si,cx
    call m10asbi
    mov ax,binval
    mov binhrs,ax
    ret
    d10hour endp
    ;-------------------------------

    e10rate proc near
    mov cl,actrlen
    sub ch,ch
    lea si,ratefld-1
    add si,cx
    call m10asbi
    mov ax,binval
    mov binrate,ax
    ret
    e10rate endp

    ;---------------------------------------
    f10mult proc near
    mov cx,07
    lea di,ascwage
    mov ax,3030h
    cld
    rep stosw

    mov shift,10
    mov adjust,0
    mov cx,nodec
    cmp cl,06
    ja f40
    dec cx
    dec cx
    jle f30
    mov nodec,02
    mov ax,01
    f20:
    mul tenwd
    loop f20
    mov shift,ax
    shr ax,1
    mov adjust,ax
    f30:
    mov ax,binhrs
    mul binrate
    add ax,adjust
    adc dx,0
    mov tempdx,dx
    mov tempax,ax

    cmp adjust,0
    jz f50

    mov ax,dx
    mov dx,0
    div shift
    mov tempdx,ax
    mov ax,tempax
    div shift
    mov dx,tempdx
    mov tempax,ax
    jmp f50

    f40:
    mov ax,0
    mov dx,0

    f50:
    ret

    f10mult endp


    ;--------------------------------------------------
    g10wage proc near
    lea si,ascwage+11
    mov byte ptr[si],'.'
    add si,nodec
    g30:
    cmp byte ptr[si],'.'
    jnz g35
    dec si
    g35:
    cmp dx,0
    jnz g40
    cmp ax,0010
    jb g50
    g40:
    mov ax,dx
    mov dx,0
    div tenwd
    mov tempdx,ax
    mov ax,tempax
    div tenwd
    mov tempax,ax
    or dl,30h
    mov [si],dl
    dec si
    mov dx,tempdx
    jmp g30
    g50:
    or al,30h
    mov [si],al
    ret
    g10wage endp

    ;-------------------------------------------------
    k10disp proc near
    mov col,50
    call q20curs
    mov cx,10
    lea si,ascwage
    k20:
    cmp byte ptr[si],30h
    jne k30
    mov byte ptr[si],20h
    inc si
    loop k20
    k30:
    lea dx,messg3
    mov ah,09
    int 21h
    cmp row,20
    jae k80
    inc row
    jmp k90
    k80:
    mov ax,0601h
    call q10scr
    mov col,0
    call q20curs
    k90:
    ret
    k10disp endp
    ;------------------------------------------------------
    m10asbi proc near
    mov mult10,01
    mov binval,0
    mov decind,0
    sub bx,bx
    m20:
    mov al,[si]
    cmp al,'.'
    jne m40
    mov decind,01
    jmp m90
    m40:
    and ax,000fh
    mul mult10
    jc overflow
    add binval,ax
    jc overflow
    mov ax,mult10
    mul tenwd
    mov mult10,ax
    cmp decind,0
    jnz m90
    inc bx
    m90:
    dec si
    loop m20
    cmp decind,0
    jz m100
    add nodec,bx
    jmp m100
    overflow:
    mov binval,0
    m100:ret
    m10asbi endp
    ;---------------------------------------------------------------
    q10scr proc near
    mov bh,07
    sub cx,cx
    mov dx,184h
    int 10h
    ret
    q10scr endp
    ;------------------------------
    q20curs proc near
    mov ah,2
    sub bh,bh
    mov dh,row
    mov dl,col
    int 10h
    ret
    q20curs endp
    ;----------------------------------------------------
    codesg ends
    end begin


    ball_int;====================================

    COUNT_NUM equ 3h    ;speed of the ball moving
    ROW_START equ 13 ;start position of row
    COL_START equ 0 ;start positon of column
    ROW_STEP equ 1
    COL_STEP equ 1
    EGG equ 7 ;the type of ball


    stack segment

    dw 100 dup(?)
    se label word

    stack ends

    data segment
    count dw COUNT_NUM
    row db ROW_START ;store the position of ball in row
    col db COL_START ;store the position of ball in column
    rflag db 0 ;the direction of moving of row
    cflag db 0 ;the direction of moving of column
    data ends

    code segment

    assume cs:code,ds:data,ss:stack
    main proc far
    start:
    mov ax,data
    mov ds,ax
    mov es,ax
    mov ax,stack
    mov ss,ax
    lea sp,se

    ;=====================================
    ;call cls
    call setcurs


    mov al,1ch ;save old interrupt vector
    mov ah,35h
    int 21h
    push es
    push bx
    push ds

    mov dx,offset ball ;set new interrupt vector
    mov ax,seg ball
    mov ds,ax
    mov al,1ch
    mov ah,25h
    int 21h


    pop ds ;set interrupt mask
    in al,21h
    and al,11111110b
    out 21h,al
    sti

    q:
    mov di,0ffffh
    delay:
    mov si,0ffffh
    delay1:
    dec si
    jnz delay1
    dec di
    jnz delay

    jmp q

    pop dx
    pop ds
    mov al,1ch
    mov ah,25h
    int 21h




    ;=====================================

    mov ax,4c00h
    int 21h

    main endp


    ball proc near
    push ds
    push ax
    push cx
    push dx

    mov ax,data
    mov ds,ax


    dec count
    jnz exit1

    mov count,COUNT_NUM

    mov bh,0
    mov al,' '
    mov cx,1
    mov ah,0ah
    int 10h


    cmp rflag,0 ;determine the direction of row
    je r_inc
    sub row,ROW_STEP
    jmp colcmp
    r_inc:
    add row,ROW_STEP
    colcmp:
    cmp cflag,0 ;determine the direction of column
    je c_inc
    sub col,COL_STEP
    jmp tifa
    c_inc:
    add col,COL_STEP
    tifa:
    cmp rflag,0
    je rcmp25
    jmp rcmp0
    rcmp25:
    cmp row,24
    jle s1
    mov row,24
    xor rflag,0ffh
    jmp s1

    exit1: ;to jump across the limit of jmp
    jmp exit

    rcmp0:
    cmp row,0
    jge s1
    mov row,0
    xor rflag,0ffh

    s1:
    cmp cflag,0
    je ccmp80
    jmp ccmp0
    ccmp80:
    cmp col,79
    jle exit
    mov col,79
    xor cflag,0ffh
    jmp exit
    ccmp0:
    cmp col,0
    jge exit
    mov col,0
    xor cflag,0ffh



    exit:
    call setcurs

    mov bh,0
    mov al,EGG
    mov cx,1
    mov ah,0ah
    int 10h


    mov al,20h
    out 20h,al
    pop dx
    pop cx
    pop ax
    pop ds
    iret

    ball endp

    cls proc near
    mov ax,0619h
    mov bh,0
    sub cx,cx
    mov dx,184h
    int 10h
    ret
    cls endp

    setcurs proc near
    mov ah,2
    sub bh,bh
    mov dh,row
    mov dl,col
    int 10h
    ret
    setcurs endp

    code ends

    end start


    ball_sub======================================

    COUNT_NUM equ 06fffh    ;speed of the ball moving
    ROW_START equ 13 ;start position of row
    COL_START equ 0 ;start positon of column
    ROW_STEP equ 1
    COL_STEP equ 1
    EGG equ 'O'

    stack segment

    dw 100 dup(?)
    se label word

    stack ends

    data segment
    count dw COUNT_NUM
    row db ROW_START
    col db COL_START
    rflag db 0
    cflag db 0
    data ends

    code segment

    assume cs:code,ds:data,ss:stack
    main proc far
    start:
    mov ax,data
    mov ds,ax
    mov es,ax
    mov ax,stack
    mov ss,ax
    lea sp,se

    ;=====================================
    ;call cls
    call setcurs

    s:
    call ball

    jmp s



    ;=====================================

    mov ax,4c00h
    int 21h

    main endp


    ball proc near
    push ds
    push ax
    push cx
    push dx

    mov ax,data
    mov ds,ax


    dec count
    jnz exit1

    mov count,COUNT_NUM

    mov bh,0
    mov al,' '
    mov cx,1
    mov ah,0ah
    int 10h


    cmp rflag,0
    je r_inc
    sub row,ROW_STEP
    jmp colcmp
    r_inc:
    add row,ROW_STEP
    colcmp:
    cmp cflag,0
    je c_inc
    sub col,COL_STEP
    jmp tifa
    c_inc:
    add col,COL_STEP
    tifa:
    cmp rflag,0
    je rcmp25
    jmp rcmp0
    rcmp25:
    cmp row,24
    jle s1
    mov row,24
    xor rflag,0ffh
    jmp s1

    exit1:
    jmp exit

    rcmp0:
    cmp row,0
    jge s1
    mov row,0
    xor rflag,0ffh

    s1:
    cmp cflag,0
    je ccmp80
    jmp ccmp0
    ccmp80:
    cmp col,79
    jle exit
    mov col,79
    xor cflag,0ffh
    jmp exit
    ccmp0:
    cmp col,0
    jge exit
    mov col,0
    xor cflag,0ffh



    exit:
    call setcurs

    mov bh,0
    mov al,EGG
    mov cx,1
    mov ah,0ah
    int 10h


    mov al,20h
    out 20h,al
    pop dx
    pop cx
    pop ax
    pop ds
    ret

    ball endp

    cls proc near
    mov ax,0620h
    mov bh,0
    sub cx,cx
    mov dx,184h
    int 10h
    ret
    cls endp

    setcurs proc near
    mov ah,2
    sub bh,bh
    mov dh,row
    mov dl,col
    int 10h
    ret
    setcurs endp

    code ends

    end start



  • 相关阅读:
    函数式编程
    高级特性
    ZooKeeper介绍
    perl 退出函数问题
    perl 处理 回车 换行符
    定义函数
    调用函数
    python 字典
    python 条件判断
    列表和数组
  • 原文地址:https://www.cnblogs.com/kanone/p/2225366.html
Copyright © 2020-2023  润新知