返回
汇编语言作业详解:探索循环、转换与进制世界
后端
2024-02-19 10:44:15
作业一:循环打印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
在这个程序中,我们首先等待用户输入一个十进制数,然后将十进制数转换为二进制数、八进制数和十六进制数,最后输出转换后的结果。