几道汇编入门题目(二)

时间:2021-11-12 01:09:54

继上次的三道汇编编程练习,本篇博客同样会介绍三道汇编相关编程题目

 


 

1 用汇编语言编写一个子程序,根据入口参数AL为0、12,分别实现大写字母转换为小写,
小写字母转换成大写或大小写字母互换。然后再编写主程序,通过调用该子程序把键盘输入
的字符串mystring(长度不超过20Byte)作相应转换(具体何种转换可以让用户通过键盘
输入来选择),并输出到屏幕显示。

 

Solution Code:

data segment
    buffer     db 81
            db 0
            db 81 dup('$')
ends

stack segment
            dw    128    dup(0)
ends

code segment
assume CS:code, DS:data

main proc far
            mov ax, data
            mov ds, ax
            mov es, ax

            mov ah, 0ah
            mov dx, seg buffer
            mov ds, dx
            lea dx, buffer
            int 21h

getkey:     mov ah, 1
            int 21h

            lea bx, buffer+2    ;input string
            mov ch, 0
            mov cl, buffer+1

            call func             ;call function

            lea dx, buffer+2    ;output string
            mov ah, 09h
            int 21h

            mov ax, 4c00h
            int 21h
main endp

func proc near
each:
            cmp al, '0'
            je func0
            cmp al, '1'
            je func1
            cmp al, '2'
            je func2
func0:
            cmp [bx], 'Z'    ;Judge whether not abc
            jle endf
            sub [bx], 32
            jmp endf
func1:
            cmp [bx], 'a'    ;Jedge whether not ABC
            jge endf
            add [bx], 32
            jmp endf
func2:
            cmp [bx], 'Z'
            jg func0
            jmp func1
endf:
            inc bx
            loop each
            ret
func endp

ends
end main

2 用汇编语言编写一个子程序,把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。
(1)    采用AX寄存器传递这个16位二进制数;
(2)    采用wordTEMP变量传递这个16位二进制数;
(3)    采用堆栈方法传递这个16位二进制数。

 

其中第二小题没有写正确,先传上来吧 :(

 

data segment
    dig dw 1010100110100011B, '$'
    tmpdig db 00, 00, 00, 00, '$'
    displayword db "     $"
    pkey db "press any key...$"
ends

stack segment
    dw 128 dup(0)
ends

code segment
main proc far
    mov ax, data
    mov ds, ax
    mov es, ax

    mov ax, dig
    call axtr        ;by register AX
    
    lea dx, displayword
    mov ah, 9
    int 21h

    call wordtmp    ;by variable wordtmp
    
    lea dx, displayword
    mov ah, 9
    int 21h

    mov ax, dig
    push ax
    mov ax, 0
    call bystack    ;by stack method

    mov ax, 4c00h
    int 21h
main endp

axtr proc near

    mov cx, 4
    mov si, 3

funcax:
    mov bx, ax
    and bx, 000Fh
    cmp bx, 0009h    ;just cmp the last bit
    jg axchar        ;jmp to axchar if it's char
    add bx, 30h        ;for ascll adjust
    jmp axsolve

axchar:
    add bx, 37h

axsolve:
    mov dx, bx
    lea bx, tmpdig
    mov [bx+si], dl    ;store current bit result
    shr ax, 4
    dec si
    loop funcax

    lea dx, tmpdig    ;display
    mov ah, 9
    int 21h
    ret

axtr endp

wordtmp proc near

    mov ax, dig
    mov cx, 4
    mov si, 3

op2:
    mov bx, ax
    and bx, 000Fh
    cmp bx, 0009h
    ja gcc3
    add bx, 30h
    jmp gcc4

gcc3:
    add bx, 37h

gcc4:
    mov dx, bx
    lea bx, tmpdig
    mov [bx+si], dl
    shr ax, 4
    dec si
    loop op2

    lea dx, tmpdig
    mov ah, 9
    int 21h
    ret

wordtmp endp

bystack proc near
    
    push bp
    mov bp, sp
    mov ax, [bp+4]
    mov cx, 4
    mov si, 3

funcstack:
    mov bx, ax
    and bx, 000Fh
    cmp bx, 0009h
    jg stackchar
    add bx, 30h
    jmp stacksolve

stackchar:
    add bx, 37h

stacksolve:
    mov dx, bx
    lea bx, tmpdig
    mov [bx+si], dl
    shr ax, 4
    dec si
    loop funcstack

    lea dx, tmpdig
    mov ah, 9
    int 21h
    pop bp
    ret

bystack endp

ends
end main

3 设数据段事先定义了一个数组存放着30位学生的成绩(0~100),
编写子程序,统计0~59分,60~69分,70~79分,80~89分,90~100分的人数,
编写主程序在屏幕上输出等级和所对应人数,例如: A:
2 B:11 C:13 D:3 E:1

 

本题还没有写完,先传上来吧 :(

 

data segment
    rst db 56, 69, 84, 82, 73, 88, 99, 63, 100, 80, '$'
    se db 0, '$'
    sd db 0, '$'
    sc db 0, '$'
    sb db 0, '$'
    sa db 0, '$'
data ends

code segment 
    assume cs:code, ds:data

start:
    mov ax, data
    mov dx, ax

    lea si, rst
    mov cx, 10

    ;lea bx, se
    ;add [bx], 1;
    ;mov ax, [bx];
    ;add ax, 30h

    ;mov ah, 02H
    ;mov dl, al
    ;int 21h

lop1:
    cmp [si], 60
    ;cmp byte ptr [si], 60
    jb five
    cmp [si], 70
    ;cmp byte ptr [si], 70
    jb six
    cmp [si], 80
    ;cmp byte ptr [si], 80
    jb seven
    cmp [si], 90
    ;cmp byte ptr [si], 90
    jb eight

    jmp nine

five:
    lea bx, se
    add [bx], 1;
    jmp lop

six:
    lea bx, sd
    add [bx], 1;
    jmp lop

seven:
    lea bx, sc
    add [bx], 1;
    jmp lop

eight:
    lea bx, sb
    add [bx], 1;
    jmp lop

nine:
    lea bx, sb
    add [bx], 1;
    jmp lop

lop:
    inc si
    loop lop1

display:
    lea bx, se
    add [bx], 30h
    mov ah, 02H
    mov dl, [bx]
    int 21h

    lea bx, sd
    add [bx], 30h
    mov ah, 02H
    mov dl, [bx]
    int 21h

    lea bx, sc
    add [bx], 30h
    mov ah, 02H
    mov dl, [bx]
    int 21h

    lea bx, sb
    add [bx], 30h
    mov ah, 02H
    mov dl, [bx]
    int 21h

    lea bx, sa
    add [bx], 30h
    mov ah, 02H
    mov dl, [bx]
    int 21h

    mov ah, 02H
    mov dl, '$'
    int 21h

exit:
    mov ah, 4ch
    int 21h

code ends
    end start