急急急,汇编语言编写,将键入四位十六进制数,输出十进制

2025-02-27 00:56:03
推荐回答(1个)
回答1:

assume cs:cseg, ds:dseg

dseg segment
  msg0 db 0dh, 0ah, 'Input Hex Number(<=FFFF):$'
  msg1 db 0dh, 0ah, 'Output Decimal value:$'
  msg2 db 0dh, 0ah, 'Input is invalid, reinput again:$'
  buf  db 10
       db 0
       db 10 dup(0)
  n    dw 0
  f    db 0
dseg ends

cseg segment
start:
  mov ax, dseg
  mov ds, ax

  lea si, n
m0:
  call readhex ;调用读取输入数据函数
  cmp f, 0     ;f>0,输入有错误,重新输入
  ja m0

  lea dx, msg1 ;显示输出
  mov ah,9
  int 21h

  mov ax, n     ;10进制
  call printdec ;输出

  mov ah,4ch
  int 21h

;read hex number(max FFFF)
;store to (si)  保存到(si)
readhex proc near
  mov f, 0     ;读取成功标志位, 0-成功,非0,失败
  lea dx, msg0 ;显示
  mov ah, 9    ;输入
  int 21h      ;提示信息

  lea dx, buf  ;读取
  mov ah, 10   ;输入
  int 21h      ;字符串

  mov ch,buf+1 ;判断输入长度,>4,错误
  cmp ch, 4
  ja error
  mov cl,4     ;
  mov bx, 0    ;
r0:                   ;r0- error
  mov ah, 0           ;判断输入的每一个字符
  mov al, [buf+2+bx]  ;合法,就进行计算(r9中计算)
  cmp al, '0'         ;否则,就显示
  jb error            ;错误提示,重新输入(error)
  cmp al, '9'
  ja  r1
  and al,0fh
  jmp  r9
r1:
  cmp al,'A'
  jb error
  cmp al, 'F'
  ja r2
  sub al, 37H
  jmp r9
r2:
  cmp al,'a'
  jb error
  cmp al, 'f'
  ja error
  sub al,57H
  jmp r9
r9:
  xchg [si], ax
  shl ax, cl
  add [si], ax
  inc bx
  dec ch
  jnz r0
  jmp exit
error:
  lea dx, msg2
  mov ah, 9
  int 21h
  mov f,  1
exit:
  ret
readhex endp

;print (ax) in Decimal
printdec proc near
  xor cx, cx
  mov bx, 10
q0:
  xor dx, dx
  div bx
  xor dx, 0e30h
  push dx
  inc cx
  cmp ax, 0
  jnz q0
q1:
  pop ax
  int 10h
  loop q1
  ret
printdec endp
cseg ends
end start