使用 masm 限制在汇编中从十六进制转换为八进制:8 位和 16 位寄存器

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

十六进制到十进制

多塞格

.模型小

.stack 100h

.数据

msg1 db 10,13,10,13,'ENTER 1 TO 4 HEX DIGITS:$'

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 位数字。

.代码

mov 斧头,@data

mov ds, ax

再次:

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,'Y'

又是

                ;TERMINATE PROGRAM.  

mov 斧头,4ch

21小时

clear_ourmemory 过程;清除我们的内存值

lea si,我们的记忆

mov al, '$'

mov 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       ;THE NUMBER.

Ciclo:

;■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■

                ;     SHL  AX, 4       ;SHIFT LEFT LOWER 4 BITS.

                ;SHIFT LEFT AL AND AH MANUALLY 4 TIMES TO SIMULATE SHL AX,4.

  shl  al, 1

  rcl  ah, 1

  shl  al, 1

  rcl  ah, 1

  shl  al, 1

  rcl  ah, 1

  shl  al, 1

  rcl  ah, 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      ;CONVERT LETTER TO NUMBER.

继续:

  OR   AL, BL      ;CLEAR UPPER 4 BITS.

  INC  SI          ;NEXT HEX CHAR.

  DEC  BH          ;BH == 0 : FINISH.

  JNZ  Ciclo       ;BH != 0 : REPEAT.

鳍:

  RET

hex2number endp

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

;INPUT : BL = HEX CHAR TO VALIDATE.

验证过程

cmp bl, '0'

jb  error           ;IF BL < '0'

cmp bl, 'F'

ja  error           ;IF BL > 'F'

cmp bl, '9'

jbe ok              ;IF BL <= '9'

cmp bl, 'A'

jae ok              ;IF BL >= 'A'

错误:

pop  ax             ;REMOVE CALL VALIDATE.

pop  ax              ;REMOVE CALL HEX2NUMBER.

            ;DISPLAY 'ILLEGAL CHARACTER- ENTER 0-9 OR A-F$'

mov  ah, 9

lea  dx, msg4

int  21h

jmp  illegal  ;GO TO 'DO YOU WANT TO DO IT AGAIN (Y/N)?$'

好的:

ret

验证结束

number2string 过程

mov bx, 10 ;数字除以 10.

mov cx, 0 ;提取数字的计数器。

循环1:

mov dx, 0 ; 必须除以 BX.

div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.

push dx ;保留提取的数字以备后用。

inc cx ;每提取一个数字就增加计数器。

cmp ax, 0 ;如果数字是

jne cycle1 ;NOT ZERO, LOOP.

            ;NOW RETRIEVE PUSHED DIGITS.

lea si,我们的记忆

循环2:

流行音乐

add dl, 48 ;将数字转换为字符。

mov [ si ], dl

公司硅

循环周期2

ret

number2string endp

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

结束 12月至10月

prnstr 宏消息

    mov ah, 09h

    lea dx, msg

    int 21h

    endm

DOSSEG

.型号小

.堆栈 100H

.数据

    buf1 db "Enter a decimal number : $"

    buf2 db 0ah, "Invalid Decimal Number...$"

    buf3 db 0ah, "Equivalent octal number is : $"

    buf4 db 6

         db 0

         db 6 dup(0)

    multiplier db 0aH

.代码

主要过程

开始:

    mov ax, @data

    mov ds, ax

    mov es, ax

    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 buf2

    jmp stop

续1:

    cmp al, 3ah

    jb cont2

    prnstr buf2

    jmp stop

续2:

    sub al, 30h

    mov byte ptr [si], al

    inc si

    loop subtract

    mov si, offset buf4 + 2

    mov cl, byte ptr [si-1]

    mov ch, 00h

    mov ax, 0000h

计算器:

    mul multiplier

    mov bl, byte ptr [si]

    mov bh, 00h

    add ax, bx

    inc si

    loop calc

    mov si, offset buf4 + 2

    mov bx, ax

    mov dx, 0000h

    mov ax, 8000h

转换:

    mov cx, 0000h

转换:

    cmp bx, ax

    jb cont3

    sub bx, ax

    inc cx

    jmp conv

续三:

    add cl, 30h

    mov byte ptr [si], cl

    inc si

    mov cx, 0008h

    div cx

    cmp ax, 0000h

    jnz convert

    mov byte ptr [si], '$'

    prnstr buf3

    prnstr buf4+2

停止:

    mov aH, 4cH

    int 21h

主要结束

结束主要 **如何合并这些代码并将十六进制转换为八进制**

无法将十六进制直接转换为八进制

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