汇编语言实现16进制字符串转换的子程序

时间: 2023-11-28 15:43:49 浏览: 79
以下是汇编语言实现16进制字符串转换的子程序: ```assembly ; 输入:SI指向16进制字符串,DI指向存储结果的内存单元 ; 输出:无 ; 功能:将16进制字符串转换为对应的数字存在内存中 HEX2DEC PROC NEAR XOR AX, AX ; AX清零 AGAIN: LODSB ; 读取一个字符到AL CMP AL, 0 ; 如果读到字符串结束符,则退出 JE EXIT SUB AL, '0' ; 将字符转换为数字 CMP AL, 9 ; 如果是数字0~9 JBE NUM SUB AL, 7 ; 如果是字母A~F NUM: SHL AX, 4 ; AX左移4位 ADD AX, AL ; 将当前字符转换后的数字加到AX中 JMP AGAIN EXIT: MOV [DI], AX ; 将转换后的数字存储到内存中 RET HEX2DEC ENDP ```
相关问题

请用8086汇编语言实现一下

以下是一个基于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) ``` 该程序实现了五种不同的子功能,用户可以根据自己的需求选择相应的功能。在每个子功能中,程序会提示用户输入相应的字母或数字,并进行相应的转换。程序还包含一个循环,直到用户选择退出程序,程序才会结束。

用汇编语言在emu8086上写一个子程序,将一个16位无符号的二进制数转换成十进制数,主程序完成二进制数的输入和十进制数的输出。(要求用堆栈做参数传递)

好的,我会尽力回答你的问题。首先,我需要说明的是,我是一个AI语言模型,没有实际的物理设备,也不支持汇编语言编程。但是,我可以为你提供一个汇编语言的思路,帮助你完成这个任务。 首先,我们需要了解一下二进制数和十进制数之间的转换规则。将一个16位的二进制数转换成十进制数,我们可以采用乘法累加法的方法。具体步骤如下: 1. 从二进制数的最高位开始,依次取出每一位数字。 2. 对于每一个二进制数位,将其乘以对应的权值(即2的幂次方),得到该位的十进制值。 3. 将所有二进制数位的十进制值相加,得到最终的十进制数值。 接下来,我们可以考虑如何用汇编语言实现这个算法。我们可以将这个算法分为两个步骤:输入二进制数和输出十进制数。 首先,我们需要在主程序中输入一个16位的二进制数,并将其存储在一个寄存器中。然后,我们需要将这个二进制数的每一位数字依次压入堆栈中,以便在子程序中进行处理。这个过程可以通过循环实现,具体如下: ``` input_binary: ;输入16位二进制数,存储在 AX 寄存器中 mov ah, 1 ;输入字符 mov cx, 16 ;循环计数器 input_loop: ;输入二进制数位 int 21h ;从键盘读取一个字符 cmp al, '0' ;判断是否是 0 jl input_loop ;如果不是 0,重新输入 cmp al, '1' ;判断是否是 1 jg input_loop ;如果不是 1,重新输入 ;将二进制数位存储到堆栈中 push ax ;将二进制数位压入堆栈中 loop input_loop ;循环输入下一位二进制数 ``` 接下来,我们需要编写一个子程序,将堆栈中的二进制数转换成十进制数,并将其存储在一个寄存器中。具体实现如下: ``` bin2dec: ;将二进制数位从堆栈中弹出,并将其转换成十进制数 xor ax, ax ;清空寄存器 AX mov bx, 1 ;权值计数器 dec sp ;将堆栈指针指向栈顶 dec sp ;跳过子程序返回地址 convert_loop: ;从堆栈中取出二进制数位 pop cx ;将二进制数位从堆栈中弹出 ;将二进制数位乘以对应的权值,并累加到寄存器 AX 中 cmp cx, 1 ;判断二进制数位是否为 1 je add_value ;如果是 1,执行加法操作 jmp next_value ;如果不是 1,跳过加法操作 add_value: ;将权值加到寄存器 AX 中 add ax, bx next_value: ;将权值乘以 2 shl bx, 1 loop convert_loop ;循环处理下一位二进制数 ;将十进制数字存储到 BX 寄存器中 mov bx, ax ret ``` 最后,我们需要在主程序中调用子程序,将十进制数输出到屏幕上。具体实现如下: ``` output_decimal: ;调用子程序,将二进制数转换成十进制数 call bin2dec ;将十进制数转换成字符串 mov bx, 10 ;除数为 10 xor cx, cx ;清空计数器 CX output_loop: xor dx, dx ;清空寄存器 DX div bx ;将 BX 除以 AX,商存储在 AL 中,余数存储在 AH 中 ;将余数转换成数字字符,并输出到屏幕上 add dl, '0' ;将余数转换成数字字符 mov ah, 2 ;输出字符 int 21h ;输出数字字符 ;判断是否已经除尽 cmp ax, 0 ;如果商为 0,除尽了 jne output_loop ;如果商不为 0,继续除法运算 ;输出换行符 mov dl, 0Ah ;换行符 mov ah, 2 ;输出字符 int 21h ;输出换行符 ``` 这样,我们就完成了一个将16位无符号的二进制数转换成十进制数的汇编语言程序。当然,这只是一个思路,具体的实现可能还需要根据具体的需求进行调整和修改。

相关推荐

S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Please enter ten numbers separated by spaces:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H N DW 0 S1 ENDS S2 SEGMENT ASSUME SS:S0, DS:S1, CS:S2, ES:S1 P PROC FAR MOV AX, S0 MOV SS, AX LEA SP, TOP MOV AX, S1 MOV DS, AX MOV AX, S1 MOV ES, AX LEA DX, TIP MOV AH, 9 INT 21H LEA SI, ARY XOR DX, DX MOV BL, 10 MOV CX, 10 INPUT: MOV AH, 1 INT 21H CMP AL, 20H ;空格分隔字符 JE SAVE;输入十进制数,将数存入SI对应的内存单元 MOV DL, AL MOV AX, [SI] MUL BL SUB DL, 30H ADD AL, DL MOV [SI], AX JMP INPUT SAVE: ADD SI, 2 LOOP INPUT;数组保存完毕 LEA SI, ARY MOV DI, SI ADD DI, 2 ;DI位于数组的第二元素的位置 MOV BP, 9 ;SI移动的次数和每一次比较的次数,第一次为9 GO: MOV CX, BP ;每一次比较的循环次数 MOV BX, [SI] ;第一个数 CMPA: CMP BX, [DI] ;比较后面的数是否比当前的小 JBE CON ;大于就比较下一个 MOV BX, [DI] ;将寄存器中的值替换为最小的值 MOV AX, DI ;AX存放最小值的偏移地址 CON: ADD DI, 2 LOOP CMPA CMP AX, 0 ;如果AX为0,则表示后面的值没有比当前值小 JE NO ;此时SI加一,移动到第二个数 下一次循环比较开始 CHANGE: MOV DX, [SI] ;78-83行替换当前值与最小值 PUSH DX MOV [SI], BX POP DX MOV DI, AX MOV [DI], DX NO: ADD SI, 2 MOV DI, SI ADD DI, 2 CALL PRINT DEC BP ;循环的次数减一 XOR AX, AX ;清除AX的内容,以便76行判断 CMP BP, 1 JNE GO EXIT: MOV AH, 4CH INT 21H P ENDP PRINT PROC NEAR PUSH SI PUSH CX PUSH AX PUSH DX LEA DX, CRLF MOV AH, 9 INT 21H LEA SI, ARY MOV CX, 10 L1: MOV AX, [SI] MOV N, AX CALL OUTPUT ADD SI, 2 MOV DX, 20H MOV AH, 2 INT 21H LOOP L1 POP DX POP AX POP CX POP SI RET PRINT ENDP OUTPUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX XOR CX, CX MOV AX, N MOV BX, 10 L2: XOR DX, DX DIV BX PUSH DX INC CX CMP AX, 0 JNE L2 L3: POP DX ADD DX, 30H MOV AH, 2 INT 21H LOOP L3 POP DX POP CX POP BX POP AX RET OUTPUT ENDP S2 ENDS END P一共123行每行都是干什么的

最新推荐

recommend-type

2005-2006期末汇编试题及答案

1.十进制数369转换成二进制数为(101110001)2,转换成十六进制数为(171)16. 2.计算机中的指令由( 操作码 )和( 地址码 )两部分组成。 3. 8086的地址总线有20根,寻址范围为( 1M )字节。 4.下一条将要执行的...
recommend-type

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a
recommend-type

matlab建立计算力学课程的笔记和文件.zip

matlab建立计算力学课程的笔记和文件.zip
recommend-type

FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写
recommend-type

matlab基于RRT和人工势场法混合算法的路径规划.zip

matlab基于RRT和人工势场法混合算法的路径规划.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。