十六进制转十进制 .数据
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 小时 主端 结束主要