返回

汇编语言作业详解:探索循环、转换与进制世界

后端

作业一:循环打印1-9

汇编语言的循环指令是程序控制流的重要组成部分。在这个作业中,我们将使用循环指令打印数字1到9。

;循环打印数字1到9

.model small
.stack 100h

.data
msg db '数字1到9:
;循环打印数字1到9

.model small
.stack 100h

.data
msg db '数字1到9:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg
    int 21h
    
    mov cx,9           ;循环9次
    mov al,1
loop:
    mov ah,2          ;调用DOS中断2号,输出字符
    mov dl,al
    int 21h
    
    inc al            ;自增数字
    loop loop         ;跳转至循环开始处
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
.code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset msg int 21h mov cx,9 ;循环9次 mov al,1 loop: mov ah,2 ;调用DOS中断2号,输出字符 mov dl,al int 21h inc al ;自增数字 loop loop ;跳转至循环开始处 mov ah,4ch ;调用DOS中断4Ch,退出程序 int 21h main endp end main

在这个程序中,我们首先将数据段寄存器ds指向数据段,然后使用循环指令cx和跳转指令loop来重复打印数字1到9。

作业二:从键盘输入一个字符并根据其大写还是小写进行相反转换

在这个作业中,我们将使用汇编语言从键盘输入一个字符,并根据其大写还是小写进行相反转换。

;从键盘输入一个字符并根据其大写还是小写进行相反转换

.model small
.stack 100h

.data
msg1 db '请输入一个字符:
;从键盘输入一个字符并根据其大写还是小写进行相反转换

.model small
.stack 100h

.data
msg1 db '请输入一个字符:$'
msg2 db '转换后的字符:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入字符
    mov al,dl        ;将输入的字符存储到al寄存器
    
    cmp al,'a'        ;比较al与'a'
    jb loop1         ;如果al小于'a',则跳转至loop1
    cmp al,'z'        ;比较al与'z'
    ja loop1         ;如果al大于'z',则跳转至loop1
    sub al,32        ;如果al在'a'和'z'之间,则将al减去32,转换为大写
    jmp loop2        ;跳转至loop2

loop1:
    cmp al,'A'        ;比较al与'A'
    jb loop2         ;如果al小于'A',则跳转至loop2
    cmp al,'Z'        ;比较al与'Z'
    ja loop2         ;如果al大于'Z',则跳转至loop2
    add al,32        ;如果al在'A'和'Z'之间,则将al加上32,转换为小写
    
loop2:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,al        ;将转换后的字符存储到dl寄存器
    mov ah,2
    int 21h          ;输出转换后的字符
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
msg2 db '转换后的字符:
;从键盘输入一个字符并根据其大写还是小写进行相反转换

.model small
.stack 100h

.data
msg1 db '请输入一个字符:$'
msg2 db '转换后的字符:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入字符
    mov al,dl        ;将输入的字符存储到al寄存器
    
    cmp al,'a'        ;比较al与'a'
    jb loop1         ;如果al小于'a',则跳转至loop1
    cmp al,'z'        ;比较al与'z'
    ja loop1         ;如果al大于'z',则跳转至loop1
    sub al,32        ;如果al在'a'和'z'之间,则将al减去32,转换为大写
    jmp loop2        ;跳转至loop2

loop1:
    cmp al,'A'        ;比较al与'A'
    jb loop2         ;如果al小于'A',则跳转至loop2
    cmp al,'Z'        ;比较al与'Z'
    ja loop2         ;如果al大于'Z',则跳转至loop2
    add al,32        ;如果al在'A'和'Z'之间,则将al加上32,转换为小写
    
loop2:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,al        ;将转换后的字符存储到dl寄存器
    mov ah,2
    int 21h          ;输出转换后的字符
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
.code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset msg1 int 21h mov ah,1 int 21h ;等待用户输入字符 mov al,dl ;将输入的字符存储到al寄存器 cmp al,'a' ;比较al与'a' jb loop1 ;如果al小于'a',则跳转至loop1 cmp al,'z' ;比较al与'z' ja loop1 ;如果al大于'z',则跳转至loop1 sub al,32 ;如果al在'a'和'z'之间,则将al减去32,转换为大写 jmp loop2 ;跳转至loop2 loop1: cmp al,'A' ;比较al与'A' jb loop2 ;如果al小于'A',则跳转至loop2 cmp al,'Z' ;比较al与'Z' ja loop2 ;如果al大于'Z',则跳转至loop2 add al,32 ;如果al在'A'和'Z'之间,则将al加上32,转换为小写 loop2: mov ah,9 mov dx,offset msg2 int 21h mov dl,al ;将转换后的字符存储到dl寄存器 mov ah,2 int 21h ;输出转换后的字符 mov ah,4ch ;调用DOS中断4Ch,退出程序 int 21h main endp end main

在这个程序中,我们首先等待用户输入一个字符,然后根据输入的字符是大小写进行转换,最后输出转换后的字符。

作业三:进制转换

进制转换是汇编语言中一个重要的概念。在这个作业中,我们将使用汇编语言将十进制数转换为二进制数、八进制数和十六进制数。

;进制转换

.model small
.stack 100h

.data
msg1 db '请输入一个十进制数:
;进制转换

.model small
.stack 100h

.data
msg1 db '请输入一个十进制数:$'
msg2 db '二进制数:$'
msg3 db '八进制数:$'
msg4 db '十六进制数:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入十进制数
    mov al,dl        ;将输入的十进制数存储到al寄存器
    
    mov bl,0         ;二进制数
    mov bh,0         ;八进制数
    mov bx,0         ;十六进制数
    mov cx,1         ;循环计数器
    
loop:
    cmp al,0         ;如果al为0,则结束循环
    je loop_end
    
    mov dx,0         ;余数
    div 2           ;将al除以2,余数存储在dx中
    add bl,cx*dx     ;将余数累加到二进制数中
    
    mov dx,0         ;余数
    div 8           ;将al除以8,余数存储在dx中
    add bh,cx*dx     ;将余数累加到八进制数中
    
    mov dx,0         ;余数
    div 16          ;将al除以16,余数存储在dx中
    add bx,cx*dx     ;将余数累加到十六进制数中
    
    mul 10          ;将al乘以10,继续循环
    inc cx          ;循环计数器加1
    jmp loop        ;跳转至循环开始处
    
loop_end:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,bl        ;将二进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出二进制数
    
    mov ah,9
    mov dx,offset msg3
    int 21h
    
    mov dl,bh        ;将八进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出八进制数
    
    mov ah,9
    mov dx,offset msg4
    int 21h
    
    mov dx,bx        ;将十六进制数存储到dx寄存器
    mov ah,21h       ;调用DOS中断21h,输出十六进制数
    int 21h
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
msg2 db '二进制数:
;进制转换

.model small
.stack 100h

.data
msg1 db '请输入一个十进制数:$'
msg2 db '二进制数:$'
msg3 db '八进制数:$'
msg4 db '十六进制数:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入十进制数
    mov al,dl        ;将输入的十进制数存储到al寄存器
    
    mov bl,0         ;二进制数
    mov bh,0         ;八进制数
    mov bx,0         ;十六进制数
    mov cx,1         ;循环计数器
    
loop:
    cmp al,0         ;如果al为0,则结束循环
    je loop_end
    
    mov dx,0         ;余数
    div 2           ;将al除以2,余数存储在dx中
    add bl,cx*dx     ;将余数累加到二进制数中
    
    mov dx,0         ;余数
    div 8           ;将al除以8,余数存储在dx中
    add bh,cx*dx     ;将余数累加到八进制数中
    
    mov dx,0         ;余数
    div 16          ;将al除以16,余数存储在dx中
    add bx,cx*dx     ;将余数累加到十六进制数中
    
    mul 10          ;将al乘以10,继续循环
    inc cx          ;循环计数器加1
    jmp loop        ;跳转至循环开始处
    
loop_end:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,bl        ;将二进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出二进制数
    
    mov ah,9
    mov dx,offset msg3
    int 21h
    
    mov dl,bh        ;将八进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出八进制数
    
    mov ah,9
    mov dx,offset msg4
    int 21h
    
    mov dx,bx        ;将十六进制数存储到dx寄存器
    mov ah,21h       ;调用DOS中断21h,输出十六进制数
    int 21h
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
msg3 db '八进制数:
;进制转换

.model small
.stack 100h

.data
msg1 db '请输入一个十进制数:$'
msg2 db '二进制数:$'
msg3 db '八进制数:$'
msg4 db '十六进制数:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入十进制数
    mov al,dl        ;将输入的十进制数存储到al寄存器
    
    mov bl,0         ;二进制数
    mov bh,0         ;八进制数
    mov bx,0         ;十六进制数
    mov cx,1         ;循环计数器
    
loop:
    cmp al,0         ;如果al为0,则结束循环
    je loop_end
    
    mov dx,0         ;余数
    div 2           ;将al除以2,余数存储在dx中
    add bl,cx*dx     ;将余数累加到二进制数中
    
    mov dx,0         ;余数
    div 8           ;将al除以8,余数存储在dx中
    add bh,cx*dx     ;将余数累加到八进制数中
    
    mov dx,0         ;余数
    div 16          ;将al除以16,余数存储在dx中
    add bx,cx*dx     ;将余数累加到十六进制数中
    
    mul 10          ;将al乘以10,继续循环
    inc cx          ;循环计数器加1
    jmp loop        ;跳转至循环开始处
    
loop_end:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,bl        ;将二进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出二进制数
    
    mov ah,9
    mov dx,offset msg3
    int 21h
    
    mov dl,bh        ;将八进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出八进制数
    
    mov ah,9
    mov dx,offset msg4
    int 21h
    
    mov dx,bx        ;将十六进制数存储到dx寄存器
    mov ah,21h       ;调用DOS中断21h,输出十六进制数
    int 21h
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
msg4 db '十六进制数:
;进制转换

.model small
.stack 100h

.data
msg1 db '请输入一个十进制数:$'
msg2 db '二进制数:$'
msg3 db '八进制数:$'
msg4 db '十六进制数:$'

.code
main proc
    mov ax,@data
    mov ds,ax
    
    mov ah,9
    mov dx,offset msg1
    int 21h
    
    mov ah,1
    int 21h          ;等待用户输入十进制数
    mov al,dl        ;将输入的十进制数存储到al寄存器
    
    mov bl,0         ;二进制数
    mov bh,0         ;八进制数
    mov bx,0         ;十六进制数
    mov cx,1         ;循环计数器
    
loop:
    cmp al,0         ;如果al为0,则结束循环
    je loop_end
    
    mov dx,0         ;余数
    div 2           ;将al除以2,余数存储在dx中
    add bl,cx*dx     ;将余数累加到二进制数中
    
    mov dx,0         ;余数
    div 8           ;将al除以8,余数存储在dx中
    add bh,cx*dx     ;将余数累加到八进制数中
    
    mov dx,0         ;余数
    div 16          ;将al除以16,余数存储在dx中
    add bx,cx*dx     ;将余数累加到十六进制数中
    
    mul 10          ;将al乘以10,继续循环
    inc cx          ;循环计数器加1
    jmp loop        ;跳转至循环开始处
    
loop_end:
    mov ah,9
    mov dx,offset msg2
    int 21h
    
    mov dl,bl        ;将二进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出二进制数
    
    mov ah,9
    mov dx,offset msg3
    int 21h
    
    mov dl,bh        ;将八进制数存储到dl寄存器
    mov ah,2
    int 21h          ;输出八进制数
    
    mov ah,9
    mov dx,offset msg4
    int 21h
    
    mov dx,bx        ;将十六进制数存储到dx寄存器
    mov ah,21h       ;调用DOS中断21h,输出十六进制数
    int 21h
    
    mov ah,4ch        ;调用DOS中断4Ch,退出程序
    int 21h
    
main endp
end main
#x27;
.code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset msg1 int 21h mov ah,1 int 21h ;等待用户输入十进制数 mov al,dl ;将输入的十进制数存储到al寄存器 mov bl,0 ;二进制数 mov bh,0 ;八进制数 mov bx,0 ;十六进制数 mov cx,1 ;循环计数器 loop: cmp al,0 ;如果al为0,则结束循环 je loop_end mov dx,0 ;余数 div 2 ;将al除以2,余数存储在dx中 add bl,cx*dx ;将余数累加到二进制数中 mov dx,0 ;余数 div 8 ;将al除以8,余数存储在dx中 add bh,cx*dx ;将余数累加到八进制数中 mov dx,0 ;余数 div 16 ;将al除以16,余数存储在dx中 add bx,cx*dx ;将余数累加到十六进制数中 mul 10 ;将al乘以10,继续循环 inc cx ;循环计数器加1 jmp loop ;跳转至循环开始处 loop_end: mov ah,9 mov dx,offset msg2 int 21h mov dl,bl ;将二进制数存储到dl寄存器 mov ah,2 int 21h ;输出二进制数 mov ah,9 mov dx,offset msg3 int 21h mov dl,bh ;将八进制数存储到dl寄存器 mov ah,2 int 21h ;输出八进制数 mov ah,9 mov dx,offset msg4 int 21h mov dx,bx ;将十六进制数存储到dx寄存器 mov ah,21h ;调用DOS中断21h,输出十六进制数 int 21h mov ah,4ch ;调用DOS中断4Ch,退出程序 int 21h main endp end main

在这个程序中,我们首先等待用户输入一个十进制数,然后将十进制数转换为二进制数、八进制数和十六进制数,最后输出转换后的结果。