怎么用汇编语言将数字组成的字符串转换成数值
编写的是汇编语言子程序。具体地说我是要将定义的字节型变量(比如:YDB80,81DUP(0))在利用DOS10号子功能输入后,将字符串形式的数字,转换成相应的数值,存储到...
编写的是汇编语言 子程序。
具体地说我是要将定义的字节型变量(比如:Y DB 80,81 DUP(0))在利用DOS 10号子功能输入后,将字符串形式的数字,转换成相应的数值,存储到一个寄存器中。
谢谢各位啦!!
其实我想要的就是个汇编 子程序。基本格式:
子程序名 PROC 类型
指令序列
子程序名 ENDP
不要想的过于复杂。简单的说也就是一位一位按照所在的位置乘以相应的位置(如十位就X10,百位就X100),最后将各位全加起来。 展开
具体地说我是要将定义的字节型变量(比如:Y DB 80,81 DUP(0))在利用DOS 10号子功能输入后,将字符串形式的数字,转换成相应的数值,存储到一个寄存器中。
谢谢各位啦!!
其实我想要的就是个汇编 子程序。基本格式:
子程序名 PROC 类型
指令序列
子程序名 ENDP
不要想的过于复杂。简单的说也就是一位一位按照所在的位置乘以相应的位置(如十位就X10,百位就X100),最后将各位全加起来。 展开
4个回答
展开全部
datacate PROC NEAR
PUSH CX (CX中保存的是实际有效字符数)
DEC CX
LEA SI,buf+2 (将SI指向字符串的首地址)
d1: INC SI
LOOP d1 (利用LOOP循环将到寄存器SI指向字符串的尾部,应该是倒数第二个字符)
POP CX
MOV DL,30h;
MOV BL,10
MOV AX,1
d2: PUSH AX (将AX压栈,保护AX中的值)
SUB BYTE PTR [SI],DL (由于字符是ASCII码表示的,因此减去30H后即可转换为十六进制数)
MUL BYTE PTR [SI]
ADD w,AX (year是前面定义的用来保存数值的字型量。即w DW 0)
POP AX (上一步将数值保存到w中,这步AX出栈,恢复AX的值)
MUL BL (使AX中的值,以10为倍数增大)
DEC SI (循环SI每次减一指向前一个字符)
LOOP d2
RET
datacate ENDP
PUSH CX (CX中保存的是实际有效字符数)
DEC CX
LEA SI,buf+2 (将SI指向字符串的首地址)
d1: INC SI
LOOP d1 (利用LOOP循环将到寄存器SI指向字符串的尾部,应该是倒数第二个字符)
POP CX
MOV DL,30h;
MOV BL,10
MOV AX,1
d2: PUSH AX (将AX压栈,保护AX中的值)
SUB BYTE PTR [SI],DL (由于字符是ASCII码表示的,因此减去30H后即可转换为十六进制数)
MUL BYTE PTR [SI]
ADD w,AX (year是前面定义的用来保存数值的字型量。即w DW 0)
POP AX (上一步将数值保存到w中,这步AX出栈,恢复AX的值)
MUL BL (使AX中的值,以10为倍数增大)
DEC SI (循环SI每次减一指向前一个字符)
LOOP d2
RET
datacate ENDP
展开全部
楼上想得太简单了。假设现在数据段有如下定义:
NUM DB '1234'
RESULT DW ? '最多放65535无符号数
那么经转换后,Result单元开始的字里就应该得到一个数为1234(一千二百三十四)。由于汇编语言的运算中,乘除运算很弱,所以要想办法乘以10、100、1000甚至更多。
以上面这个假设为例,仅限5位数(NUM定义的字符串长度<5 ),可得出如下源程序的主体部分:
MOV CL,5 '字符串长度
MOV DI,OFFSET NUM
LP: MOV AL,10
MOV DL,[DI] '取得ASCII码
DEC DL,30H '得到数值
CMP DL,9
JA ERR '大于9则为非数字
ADD BL,DL
MUL BL
MOV BX,AX '结果暂存
INC DI '指向下一字符串
LOOP LP
……
err: ……
程序中,第一行5是字符串长度,可根据实际情况更改为4、3甚至2;对于取得的字符,简单比较了下其大于9的情况,没有比较其小于0的情况,可适当修改。
愿你能看懂,并作修改。
NUM DB '1234'
RESULT DW ? '最多放65535无符号数
那么经转换后,Result单元开始的字里就应该得到一个数为1234(一千二百三十四)。由于汇编语言的运算中,乘除运算很弱,所以要想办法乘以10、100、1000甚至更多。
以上面这个假设为例,仅限5位数(NUM定义的字符串长度<5 ),可得出如下源程序的主体部分:
MOV CL,5 '字符串长度
MOV DI,OFFSET NUM
LP: MOV AL,10
MOV DL,[DI] '取得ASCII码
DEC DL,30H '得到数值
CMP DL,9
JA ERR '大于9则为非数字
ADD BL,DL
MUL BL
MOV BX,AX '结果暂存
INC DI '指向下一字符串
LOOP LP
……
err: ……
程序中,第一行5是字符串长度,可根据实际情况更改为4、3甚至2;对于取得的字符,简单比较了下其大于9的情况,没有比较其小于0的情况,可适当修改。
愿你能看懂,并作修改。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
假定这些字串是正整数;
先把寄存器清零,比如 Mov ax,0
先取那个字串的最高位字符,然后转成相应的数字, 比如“0”的ASCII码是48,把这个串减去48就是所代表的数字
然后把这个数加到寄存器中
如果还有字串要加入的话,
就把寄存器乘10,加入新的字符
直到最后出了这个字串的数值。
其他格式的类似,比如小数位,比如负数
先把寄存器清零,比如 Mov ax,0
先取那个字串的最高位字符,然后转成相应的数字, 比如“0”的ASCII码是48,把这个串减去48就是所代表的数字
然后把这个数加到寄存器中
如果还有字串要加入的话,
就把寄存器乘10,加入新的字符
直到最后出了这个字串的数值。
其他格式的类似,比如小数位,比如负数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
汇编语言么?你可以用CHAR()这种前面加个你想转换的符号来强制转换数值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询