mov ax 62627,10中的10一般是不是16进制的?

从键盘输入一个16进制数,转换成十进制数然后输出,汇编程序实现啊_百度知道
从键盘输入一个16进制数,转换成十进制数然后输出,汇编程序实现啊
比如输入数字1到9,则输出1到9,如果输入字母a b c ...则输出10 11 12 有人帮编出个能运行的汇编程序吗?别给我讲原理上是怎么转化,亲自动手做出才哈·
我帮你写,不懂的可以问我。 加了个错误提示信息,而且写上注释给你 DATA SEGMENT
DATA1 DB ?
DATA2 DB 2 DUP(?)
DATA20 DB 2 DUP(?)
DATA3 DB 'Input Error, Please Enter Again!','$'
STACK SEGMENT
DB 5 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX MOV AX,STACK
INPUT:MOV AH,01H
INT 21HCMP AL,51H;判断输入的字符是否为Q
JE EXIT ;如果是Q就退出
CMP AL,71H;判断输入的字符是否为q
JE EXIT;如果是Q就退出PUSH AX;把从键盘输入的字符的ASCII存到堆栈段
SUB AL,30H ;判断是否为数字
CMP AL,00HJL INDI
;如果不是就提示错误 CMP AL,09H ;
MOV BL,AL ;
JLE OUTPUT2;如果是数字就输出
;把AL的值取出来PUSH AX ;
SUB AL,41H;判断是否为大写字母A到F
CMP AL,00H
JL INDI;如果不是就提示错误CMP AL,06H
POP AXPUSH AX
SUB AL,61H;判断是否为小写字母a到f
CMP AL,00H
JL INDI ;如果不是就提示错误
CMP AL,06H
POP AXJMP INDICHANGE:MOV SI,0MOV DI,0MOV CL,4MOV AL,BLAND AL,B;统一换为大写字母再转换,如果是大写字母就不变SUB AL,31HMOV BL,ALAND AL,0FH ;与运算,取低位MOV [DATA2+SI],AL ;把个位数存到DATA2中MOV AL,BLSAR AL,CL ;算术右移,取高位MOV[DATA20+DI],AL;把十位数存到DATA20中OUTPUT1: MOV DL,48H;输出十六进制符号HMOV AH,02HINT 21HMOV DL,3DH ;输出等号‘=’MOV AH,02HINT 21HMOV DL,[DATA20+DI];输出十位数ADD DL,30HMOV AH,02HINT 21HMOV DL,[DATA2+SI];输出个位数ADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUT;跳到输入数字
MOV DL,48H ;输出数字MOV AH,02HINT 21HMOV DL,3DHMOV AH,02HINT 21HMOV DL,BLADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUTINDI:MOV DL,20H ;提示子程序MOV AH,02HINT 21HMOV DX,OFFSET DATA3 ;显示提示信息MOV AH,09HINT 21HJMP INPUT
EXIT:MOV AH,4CHINT 21HCODE ENDSEND START
其他类似问题
为您推荐:
16进制的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1999人阅读
摘要:关于VC++中2进制,10进制,16进制相互转换的深入研究。
  下面是一个图例表示转换过程使用的函数
BinToDec CString::Format
2 --------------------------& 10 ---------------------------& 16
2 &-------------------------- 10 &--------------------------- 16
DecToBin strtoul&
2 进制 -----& 10 进制
  CString BinToDec(CString strBin)
  CString strD
  long nDec = 0, nL
  int i, j,
  nLen = strBin.GetLength();
  for (i=0; i&nL i++)
  if ( strBin[nLen-i-1] == '0' )
  k = 1;
  for(j=0; j&i; j++)
  k = k * 2;
  nDec +=
  strDec.Format(&%ld&, nDec);
  return strD
10 进制 -----& 2 进制
  CString DecToBin(CString strDec)
  int nDec = atoi(strDec);
  int nYushu, nS
  CString strBin = _T(&&), strT
  TCHAR buf[2];
  BOOL bContinue = TRUE;
  while ( bContinue )
  nYushu = nDec % 2;
  nShang = nDec / 2;
  sprintf(buf, &%d&, nYushu);
  strTemp = strB
  strBin.Format(&%s%s&, buf, strTemp);
  nDec = nS
  if ( nShang == 0 )
  bContinue = FALSE;
  int nTemp = strBin.GetLength()%4;
  switch(nTemp)
  case 1:
  strTemp.Format(_T(&000%s&), strBin);
  strBin = strT
  case 2:
  strTemp.Format(_T(&00%s&), strBin);
  strBin = strT
  case 3:
  strTemp.Format(_T(&0%s&), strBin);
  strBin = strT
  default:
  return strB
2进制 -----& 16进制
  2进制先转换为10进制,再转换为16进制
  CString strDec, strBin, strH
  strBin = _T(&1110&);
  strDec = BinToDec(strBin);
  int nD
  nDec = atol(strDec);
  strHex.Format(_T(&%x&), nDec);
10 进制 -----& 16 进制
  int nDec = 10;
  str.Fomat(_T(&%x&), nDec);
16 进制 -----& 10 进制
  CString strDec, strH
  strHex = _T(&af&);
  DWORD dwHex = strtoul(strHex, NULL, 16);
  strDec.Format(_T(&%ld&), dwHex);
16 进制 -----& 2 进制
  16进制先转换为10进制,再转换为2进制
  CString strDec, strBin, strH
  strHex = _T(&af&);
  DWORD dwHex = strtoul(strHex, NULL, 16);
  strDec.Format(_T(&%ld&), dwHex);
  strBin = DecToBin(strDec);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:579061次
积分:6121
积分:6121
排名:第1864名
原创:75篇
转载:201篇
评论:68条
(6)(2)(1)(2)(1)(3)(1)(3)(1)(7)(14)(1)(4)(1)(1)(4)(3)(1)(33)(8)(58)(26)(3)(1)(24)(28)(18)(3)(3)(6)(10)(1)输入一个无符号十进制数字串,以四位十六进制的形式输出该串对应的值。 - CSDN博客
DATA SEGMENT
BUF1 DB &20
& & DB & ?
& & DB 20 DUP(?)
BUF2 DB &20
& & DB & ?
& & DB 20 DUP(?)
INPUT DB 'Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'
SHI DW 0AH & & & & ;不能是DB,用DW,要用字乘法
Iint &DW 0
STACK SEGMENT
& & & DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
&ASSUME CS:CODE,DS:DATA,SS:STACK
MOV AX,DATA
;输出提示符‘Input:’
LEA DX,INPUT
;输入数值
LEA DX,BUF1
;输出回车换行
LEA DX,CTRL
;把ASCII码化成十进制
MOV CL,BUF1+1 & &;获取字符个数
LEA SI,BUF1+2 & & ;首地址
;转化好的存在Iint中
;因为MUL DL,所以单独处理第一个字符
MOV Dl,[SI]
SUB Al,30H
;MOV DL,10 & ;用这两行的话,如果是字乘法,那么结果存在DX,AX中,所以导致转化成的16进制为4位时,高字节存&
;MUL 10 & & & &&&;在DX中,所以老是出错
MUL [SHI] &
MOV DL,[SI]
SUB BL,30H
MOV [Iint],AX
;把十进制转化为十六进制
MOV CL,0 &;记录有多少个数据入栈
MOV AX,[Iint]
DIV BX & &;AX/(OPS)==&AL,AH
MOV BX,AX ;保存商,用于辗转相除
PUSH DX & & &;把余数入栈,所以要把商赋为0
MOV AX,BX & ;还原商,用于辗转相除
MOV DX,0 & &;消除上次的余数
JBE AAAA & &;小于等于0,则说明已经有4位了
CMP AL,9 & ;把16进制转化成ascii
ADD AL,30H
JMP XIAOYU9
ADD AL,37H
MOV [SI][BUF2],AL
JNE OUTSTACK
MOV [SI][BUF2],'H'
;输出提示提示符
LEA DX,OUTPUT
;输出数值
LEA SI,BUF2
MOV DX,[SI]
MOV AH,4CH
由于MUL这个地方没注意,搞得好纠结,故贴上其解释,前车之鉴啊
MUL 无符号数乘法指令
格式:MUL SRC
执行的操作:
字节操作数:(AX)←(AX)*(SRC)
字操作数:(DX,AX)←(AX)*(SRC)
·IMUL 带符号数乘法指令
格式:IMUL SRC
执行的操作:与MUL相同,担必须是带符号数,而MUL是无符号数。
在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。两个8位数相乘得到的是16们乘积存放在AX中,两个16位数相乘得到的是32位乘积,存放在DX,AX中,其中DX存放高位字,AX存放低位字。指令中的源操作数可以使用除立即数方式以外的任一种寻址方式。&
MUL指令和IMUL指令的使用条件是由数的格式决定的。很明显(b)*(b)当把它看作无符号数时应为255d×255d=65025d,而把它看作带符号数时则为(-1)×(-1)=1。因此必须根据所要相乘的格式来决定选用哪一种指令。
乘法指令对除CF和OF以外的条件码位无定义(注意:无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变。),对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF和OF均为1。这样的条件码设置可以用来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CF和OF均为0,否则就均为1。
&&&&&&如(AL)=0B4H,(BL)=11H求执行指令IMUL BL和MUL BL后的乘积值。
&&&&&&(AL)=0B4H为无符号数的180D,带符号数的-76D,
&&&&&&(BL)=11H为无符号数的17D,带符号数的17D,
执行IMUL BL的结果为:
&&&&(AX)=0FAF4H=-1292D
&&&&CF=0F=1
执行MUL的结果为:
&&&&(AX)=0BF4H=3060D
&&&&CF=0F=1二进制转为10进制8进制16进制的答案是不是分别为13.0125.八进制为15.15 十六进制为D4不知道我的答案正确吗?不正确请指出错误的地方并指出正确的算法.谢谢_百度作业帮
二进制转为10进制8进制16进制的答案是不是分别为13.0125.八进制为15.15 十六进制为D4不知道我的答案正确吗?不正确请指出错误的地方并指出正确的算法.谢谢
二进制转为10进制8进制16进制的答案是不是分别为13.0125.八进制为15.15 十六进制为D4不知道我的答案正确吗?不正确请指出错误的地方并指出正确的算法.谢谢
十进制为13.125,八进制为15.10,十六进制为D.2二进制转十进制时,小数部分也是采用“按权展开相加”的方法,小数点后第一位的权为2^(-1),第二位的权为2^(-2),以此类推,所以0.^(-3)=0.125.二进制数转换为八进制数时,整数部分从低位到高位每3位一组,最高位不够位补零,小数部分从高位到低位也是3位一组,最低位不够位补零,将3位一组的二进制数用八进制数代入即可.所以:1 101.001 000=15.10(八进制数数)二进制数转换为十六进制数时,整数部分从低位到高位每4位一组,最高位不够位补零,小数部分从高位到低位也是4位一组,最低位不够位补零,将4位一组的二进制数用十六进制数代入即可.所以:=D.2.(十六进制数)是不是只有用mov ax,02h才能输出16进制数,用mov ax,09h不行吗_汇编吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,471贴子:
是不是只有用mov ax,02h才能输出16进制数,用mov ax,09h不行吗收藏
datarea segment str dw strtwostrtwo db 'fec08fa3b7ae2a25bee3d6d55fbdab9$'letter_one dw 0el_se dw 0number dw 0display dw 6 dup(?),13,10,'$'datarea endscode segmentmain proc farassume cs:code,ds:datareastart: push dssub ax,axpush axmov ax,datareamov ds,axmov ax,0mov bx,0compare: mov al,ds:[bx]cmp al,26 ='$'exitjz exitcmp al,30h jl oth_elcmp al,3ahjl numbcmp al,41hjl oth_elcmp al,5bhjl lettcmp al,61hjl oth_elcmp al,7bhjl lettjge oth_elinc bxjmp short comparenumb:数字字符 inc bxjmp short comparelett: inc letter_字母字符inc bx jmp short compareoth_el: inc el_其他字符inc bxjmp short compareexit: lea si,想用先复制三个数据进display,然后用mov ax,09h,输出16进制数,失败了mov ax,numbermov [si],axmov ax,letter_onemov [si+2],axmov ax,el_semov [si+4],axmov dx,the result is wrongmov ah,09hint 21hretmain endp code endsend start
datarea segment addr dw numbernumber dw 7ahcount dw ?datarea endsprognam segment main proc farassume cs:prognam,ds:datarea,es:datareastart: push dssub ax,axpush axmov ax,datareamov ds,axmov cx,0repeat: test ax,0ffffhjz exitjns shiftinc cxshift: shl ax,1jmp repeatexit: mov count,cxadd cx,30hcmp cx,3ahjg aboverjl exit1abover: add cx,7exit1: mov dx,cx ;这个倒是可以出现16进制的数就是要显示3个数的话这样子好麻烦mov ah,02hint 21hretmain endpprognam endsend start
好的,谢谢,用mov ah,02显示的三个数有两个错的,好像main有误,字符串6 dup(?),13,10,'$'中的数据好像被改就不显示6个?出现的时好长的图形一样的东西 最后不知道为什么贴吧里没法用楼中楼回复,只能回复楼主
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 mov ax bx 的文章

 

随机推荐