请用8086汇编语言实现一下
时间: 2023-07-11 17:15:57 浏览: 98
以下是一个基于8086汇编语言的示例代码:
```assembly
.model small
.stack 100h
.data
input db 10, 0
output db 10, 13, "转换后的结果为:$"
letter db 0
binary db 16 dup(0)
hex db 8 dup(0)
decimal dw 0
.code
main proc
mov ax, @data
mov ds, ax
; 显示菜单
call display_menu
; 读取用户的选择
read_choice:
mov ah, 1
int 21h
cmp al, '1'
je lower_to_upper
cmp al, '2'
je upper_to_lower
cmp al, '3'
je bin_to_hex
cmp al, '4'
je hex_to_bin
cmp al, '5'
je hex_to_dec
cmp al, 'q'
jne read_choice
jmp exit_program
; 子功能1:小写字母向大写字母的转换
lower_to_upper:
call read_letter
cmp letter, 'a'
jb invalid_input
cmp letter, 'z'
ja invalid_input
sub letter, 32
call display_output
jmp read_choice
; 子功能2:大写字母向小写字母的转换
upper_to_lower:
call read_letter
cmp letter, 'A'
jb invalid_input
cmp letter, 'Z'
ja invalid_input
add letter, 32
call display_output
jmp read_choice
; 子功能3:二进制数向十六进制数的转换
bin_to_hex:
call read_binary
call bin_to_decimal
call decimal_to_hex
call display_output
jmp read_choice
; 子功能4:十六进制数向二进制数的转换
hex_to_bin:
call read_hex
call hex_to_decimal
call decimal_to_binary
call display_output
jmp read_choice
; 子功能5:十六进制数向十进制数的转换
hex_to_dec:
call read_hex
call hex_to_decimal
call decimal_to_string
call display_output
jmp read_choice
; 读取一个字母
read_letter:
mov ah, 1
int 21h
mov bl, al
cmp bl, 'a'
jb invalid_input
cmp bl, 'z'
ja invalid_input
mov letter, bl
ret
; 读取一个二进制数
read_binary:
mov ah, 0ah
lea dx, input
int 21h
mov ah, 0
mov cl, [input+1]
mov bx, 2
mov ax, 0
mov si, 2
read_binary_loop:
cmp si, cl
jg binary_to_decimal
mov dl, [input+si]
sub dl, '0'
mul bx
add ax, dx
mov dx, 0
add si, 1
jmp read_binary_loop
; 二进制数转换为十进制数
binary_to_decimal:
mov decimal, ax
ret
; 十进制数转换为十六进制数
decimal_to_hex:
mov bx, 10
mov cx, 0
decimal_to_hex_loop:
xor dx, dx
div bx
cmp ax, 0
je decimal_to_hex_end
push dx
inc cx
jmp decimal_to_hex_loop
decimal_to_hex_end:
mov di, 0
mov ah, 0
decimal_to_hex_loop2:
pop dx
cmp dx, 10
jb decimal_to_hex_char
add dl, 7
decimal_to_hex_char:
add dl, '0'
mov [hex+di], dl
inc di
loop decimal_to_hex_loop2
ret
; 十六进制数转换为十进制数
hex_to_decimal:
mov bl, 16
mov al, [hex+1]
cmp al, '0'
jge hex_to_decimal_loop
add al, 10
hex_to_decimal_loop:
xor ah, ah
mov dl, al
mul bl
add decimal, ax
mov ax, 0
inc si
mov al, [hex+si]
cmp al, '$'
je hex_to_decimal_end
cmp al, '0'
jge hex_to_decimal_loop
add al, 10
jmp hex_to_decimal_loop
hex_to_decimal_end:
ret
; 十进制数转换为二进制数
decimal_to_binary:
mov bx, 2
mov cx, 0
decimal_to_binary_loop:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne decimal_to_binary_loop
mov si, 0
mov ah, 0
decimal_to_binary_loop2:
pop dx
add dl, '0'
mov [binary+si], dl
inc si
loop decimal_to_binary_loop2
ret
; 十进制数转换为字符串
decimal_to_string:
mov bx, 10
mov cx, 0
decimal_to_string_loop:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne decimal_to_string_loop
mov si, 0
mov ah, 0
decimal_to_string_loop2:
pop dx
add dl, '0'
mov [hex+si], dl
inc si
loop decimal_to_string_loop2
ret
; 显示菜单
display_menu:
mov ah, 9
lea dx, menu
int 21h
ret
; 显示转换结果
display_output:
mov ah, 9
lea dx, output
int 21h
mov ah, 2
lea dx, result
int 21h
mov ah, 2
mov dl, '$'
int 21h
ret
; 读取一个十六进制数
read_hex:
mov ah, 0ah
lea dx, input
int 21h
mov ah, 0
mov cl, [input+1]
mov si, 1
read_hex_loop:
add si, 1
mov al, [input+si]
cmp al, '$'
je read_hex_end
mov [hex+si-2], al
cmp al, '0'
jge read_hex_loop
sub al, 10
mov [hex+si-2], al
jmp read_hex_loop
read_hex_end:
ret
; 显示错误消息
invalid_input:
mov ah, 9
lea dx, error
int 21h
jmp read_choice
; 退出程序
exit_program:
mov ah, 4ch
int 21h
main endp
menu db 10, 13, "请选择以下子功能:", 10, 13
db "1. 小写字母向大写字母的转换", 10, 13
db "2. 大写字母向小写字母的转换", 10, 13
db "3. 二进制数向十六进制数的转换", 10, 13
db "4. 十六进制数向二进制数的转换", 10, 13
db "5. 十六进制数向十进制数的转换", 10, 13
db "按 q 键退出程序", 10, 13, "$"
error db 10, 13, "输入错误,请重新选择!", 10, 13, "$"
result db 8 dup(0)
```
该程序实现了五种不同的子功能,用户可以根据自己的需求选择相应的功能。在每个子功能中,程序会提示用户输入相应的字母或数字,并进行相应的转换。程序还包含一个循环,直到用户选择退出程序,程序才会结束。
阅读全文