注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

无符号整型数的十进制表示  

2014-12-06 13:27:53|  分类: x86ASM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
数据在汇编语言中是采用的十六进制,或者严格意思上来说,是采用二进制表示的,例如1234ABCDH=305441741,通常我们并不能直接看出来对应的十进制是多少,因此中间需要有一个转化的过程,下面的例程dtoc将dword值无符号整型数转化为对应的十进制值。
ASSUME CS:CODE,DS:DATA,SS:STACK
;DATA,FOR CONVERSION AND RESTORE RESULT
DATA SEGMENT
  DW 1234H,5678H;HIGH 16 BITS AND LOW 16 BITS
  DB 16 DUP(?)
DATA ENDS

;STACK, 256 BYTES
STACK SEGMENT
  DB 100H DUP(0)
STACK ENDS

;CODES
CODE SEGMENT
MAIN:
  MOV AX,DATA
  MOV DS,AX
  MOV AX,STACK
  MOV SS,AX
  MOV SP,20H
  MOV DX,DS:[0]
  MOV AX,DS:[2]
  MOV SI,0004H
  CALL DTOC
  MOV AX,4C00H
  INT 21H

;函数例程:DTOC
;说明:将一个DWORD值显示其对应的整型值,字符串以00字节结尾
;输入
; DX:被除数高16位
; AX:被除数低16位
; DS[SI]:转化后字符串首地址
;输出
;DS:[SI]中将用字符填充,并以00H结尾,CX中储存字符串长度(不包括00)
DTOC:
  PUSHF
  PUSH DX
  PUSH BX
  PUSH AX
  PUSH SI
  MOV BX,0000H;BX KEEP THE LOOP TIMES
  MOV CX,0AH;DIVIDED BY 10
S:
  CALL DIVDW
  ;NOW CX KEEPS THE REMAINDER
  ;DX:AX KEEPS QUOTIENT,READY AS THE DIVIDEND FOR NEXT DIVISION
  ;NOTE THAT WHEN DIVIDEND IS 0,LOOP EXIT   
  ADD CX,30H;CHANGE REMAINDER VALUE TO CHAR
  PUSH CX;KEEP REMAINDER IN STACK
  INC BX
  ;CHECK IF QUOTIENT IS 0
  ;MAKE CX=(AX OR DX),IF CX=0 IT MEANS DX=0 AND AX=0
  ;THEN WE CAN SURE THAT DIVIDEND IS 0
  MOV CX,AX
  OR CX,DX
  JCXZ OK
  MOV CX,0BH;THUS LOOP CAN ONLY EXIT WHEN DX=0 AND AX=0 
  ;WHEN CX=11, ENCOUNTER LOOP,CX=10
  LOOP S
OK:
  ;FINISHED, NOW POP VALUES
  MOV AX,SI
  MOV CX,BX;LOOP TIMES
S2: 
  POP BX;FETCH THE REMAINDER INTO BX
  MOV DS:[SI],BL;EACH TIME WRITE A BYTE
  INC SI      
  LOOP S2
  ;FINALLY THE 00H
  MOV BL,00H
  MOV DS:[SI],BL;END IN 00H 
  MOV CX,SI;CX IS THE LENGTH OF STRING
  ;CALCULATE THE LENGTH OF STRING
  SUB CX,AX
  POP SI
  POP AX
  POP BX
  POP DX
  POPF
  RET
;END OF FUNCTION DTOC

;函数例程:DIVDW
;说明:处理一个DWORD除以WORD可能产生溢出的除法
;输入
; DX:被除数高16位
; AX:被除数低16位
; CX:除数
;输出
; DX:商的高16
; AX:商的低16
; CX:余数
; 其他受影响寄存器:无
DIVDW:  
    PUSHF
    PUSH BX
    PUSH AX
    MOV AX,DX
    MOV DX,0000H
    DIV CX
    ;AX商(高位),DX余数
    MOV BX,AX
    POP AX
    DIV CX
    ;AX中是商(低位),DX余数 
    MOV CX,DX
    MOV DX,BX
    POP BX
    POPF
    RET
;END OF DIVDW

CODE ENDS
END MAIN
  评论这张
 
阅读(353)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016