十六进制到十进制
多塞格
.模型小
.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
主要结束
结束主要 **如何合并这些代码并将十六进制转换为八进制**
无法将十六进制直接转换为八进制