如何将十六进制转十进制和十进制转八进制这两个程序合并成一个十六进制转八进制的程序。限制:使用 Masm

问题描述 投票:0回答:0

十六进制转十进制 .数据

msg1 db 10,13,10,13,'输入 1 到 4 个十六进制数字:$' msg2 db 10,13,'IN DECIMAL IS IT:$' msg3 db 10,13,10,13,'你想再做一次吗(是/否)?$' msg4 db 10,13,'非法字符 - 输入 0-9 或 A-F:$'

hex db 5,?,5 dup(?) ;可变为 3 个部分。 ourmemory db 6 dup('$') ;结果可能有 5 位数字。 exit_key DB 10,13,'按任意键退出...$'

.代码 主程序 移动斧头,@data mov ds, 斧头

再次:

call clear_ourmemory ;CLEAR OURMEMORY(以防它保留先前的结果)。

mov ah, 9 ;DISPLAY 'ENTER 1 TO 4 HEX DIGITS:$' lea dx, msg1 国际 21 小时

mov ah, 0ah ;将十六进制数捕获为字符串 lea dx, 十六进制 国际 21 小时

                ;CONVERT HEX-STRING TO NUMBER.

lea si, hex+2 ; 十六进制字符串的字符。 mov bh, [si-1] ;第二个字节是长度。 调用 hex2number ;AX 中的数字返回。

                ;CONVERT NUMBER TO DECIMAL-STRING TO DISPLAY.

lea si,我们的记忆 call number2string ;STRING 在 SI (OURMEMORY) 中返回。

                ;DISPLAY 'IN DECIMAL IS IT:$'

mov啊,9 lea dx, msg2 国际 21 小时

                ;DISPLAY NUMBER AS STRING.

mov啊,9 lea dx,我们的记忆 国际 21 小时

非法:;发现无效字符时跳转到这里。

                ;DISPLAY 'DO YOU WANT TO DO IT AGAIN (Y/N)?$' 

mov啊,9 lea dx, msg3 国际 21 小时

                ;CAPTURE KEY.

mov啊,1 整整 21 小时 cmp al,'Y' 我又来了 cmp al,'N' 我退出 cmp al,'y' 我又来了 cmp al,'n' 我退出

出口: 移动啊,9 lea dx,exit_key 整整 21 小时 移动啊,0 int 16h ;终止程序。
mov啊,4ch 国际 21 小时

主端

clear_ourmemory 过程;清除我们的内存值 lea si,我们的记忆 mov al, '$' 移动 cx, 5
清算: mov [si], al 公司硅 循环清除

ret clear_ourmemory 结束

                ;---------------------------------------------  
                ;INPUT  : BH = STRING LENGTH (1..4).
                ;SI = OFFSET HEX-STRING.
                ;OUTPUT : AX = NUMBER.

hex2number 过程 MOV AX, 0 ; 数字。 环克洛: ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■ ; SHL AX, 4 ; 左移低 4 位。 ;手动向左移动 AL 和 AH 4 次以模拟 SHL AX,4。 shl al, 1 rcl啊,1 shl al, 1 rcl啊,1 shl al, 1 rcl啊,1 shl al, 1 rcl啊,1 ;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■

  MOV  BL, [ SI ]            ;GET ONE HEX CHAR FROM STRING.

  call validate

  CMP  BL, 'A'     ;BL = 'A'..'F' : LETTER.
  JAE  letterAF    ;BL = '0'..'9' : DIGIT.
        ;CharIsDigit09.
  SUB  BL, 48      ;CONVERT DIGIT TO NUMBER.
  JMP  continue   

字母AF:
SUB BL, 55 ;将字母转换为数字。 继续: 或 AL, BL ;清除高 4 位。 INC SI ;下一个十六进制字符。 DEC BH ;BH == 0 : 完成。 JNZ Ciclo ;BH != 0 : 重复。 鳍: 休息时间 十六进制数 endp

;--------------------------------------------
;INPUT : BL = HEX CHAR TO VALIDATE.

验证过程 cmp bl, '0' jb 错误;如果 BL < '0' cmp bl, 'F' ja error ;IF BL > 'F' cmp bl, '9' jbe ok ;如果 BL <= '9' cmp bl, 'A' jae ok ;IF BL >= 'A' 错误:
pop ax ;删除调用验证。 pop ax ;删除调用 HEX2NUMBER。 ;显示“非法字符 - 输入 0-9 或 A-F$” 移动啊,9 lea dx, msg4 整整 21 小时 jmp 非法;转到“你想再做一次吗(是/否)?$” 好的:
退役 验证结束p

number2string 过程 mov bx, 10 ;提取数字除以 10。 mov cx, 0 ;提取数字的计数器。 周期一:
mov dx, 0 ; 必须除以 BX。 div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER。 push dx ;保留提取的数字以备后用。 inc cx ;每提取一个数字就增加计数器。 cmp ax, 0 ;如果数字是 jne cycle1 ;非零,循环。 ;现在检索推送的数字。 lea si,我们的记忆 循环2:
流行音乐
add dl, 48 ;将数字转换为字符。 移动 [ si ], dl 公司硅 循环cycle2

ret number2string endp

;----------------------------------------

结束主要

十二月至十月 prnstr 宏消息 移动啊,09h lea dx, 消息 整整 21 小时 endm DOSSEG .型号小 .堆栈 100H

.数据 buf1 db“请输入十进制数:$” buf2 db 0ah,“无效的十进制数...$” buf3 db 0ah, "等效的八进制数是:$" buf4分贝6 数据库 0 分贝 6 双联 (0) 乘数 db 0aH

.代码 主要过程
开始 : 移动斧头,@data mov ds, 斧头 移动,斧头

    prnstr buf1

    mov ah, 0ah
    lea dx, buf4
    int 21h

    mov si, offset buf4 + 2
    mov cl, byte ptr [si-1]
    mov ch, 00h

减法: mov al, byte ptr [si] cmp al, 30h jnb cont1 prnstr 缓冲区 2 跳转停止 续 1: cmp al, 3ah jb cont2 prnstr 缓冲区 2 跳转停止 续 2: 子铝,30 小时 mov 字节指针 [si], al

    inc si
    loop subtract

    mov si, offset buf4 + 2
    mov cl, byte ptr [si-1]
    mov ch, 00h
    mov ax, 0000h

计算: 乘数 mov bl, byte ptr [si] 移动 bh, 00h 添加 ax, bx 公司硅 循环计算

    mov si, offset buf4 + 2
    mov bx, ax
    mov dx, 0000h
    mov ax, 8000h

转换: mov cx, 0000h 转换: cmp bx, 斧头 jb cont3 子 bx, ax 公司客户 跳转 续 3: 添加 cl,30h mov byte ptr [si], cl 公司硅 mov cx, 0008h div cx cmp 轴,0000h jnz 转换

    mov byte ptr [si], '$'
    prnstr buf3
    prnstr buf4+2

停止: 移动啊,4cH 整整 21 小时 主端 结束主要

assembly hex masm octal
© www.soinside.com 2019 - 2024. All rights reserved.