关于键盘输入二个十制数相加的思路?请教
我有一道题目,从键盘输入二个-32768---32767的数,中间可以用减号或加号,求最后的结果,输不输出无所谓!
我的思路是,先把输进的数转化成二进制数,然后用add,sub求最后的结果(我不太喜欢用bcd运算)
可是我这段程序总是通不过,我不知道我的这个想法对不对?
我是这么转换的(0*10)+x1*10......
谢谢!!
问题点数:40、回复次数:18Top
1 楼zara(Kyrie eleison)回复于 2005-06-15 09:27:24 得分 40
应该是 ((((0*10)+x1)*10+x2)*10+x3)*10....+xn 吧. 0 是累加和的初始值, x1,x2,x3, ... 是数值的各位字符, 从左向右的顺序Top
2 楼mydo(侯佩|hopy|ks)回复于 2005-06-15 10:12:19 得分 0
ascii -> bin
;由 read过程 完成接受输入和转换,并将转换后的值放入 ax 返回。
;以下程序在 masm611 下调试通过。
.model small
.data
val dw ?
.code
.startup
call read
mov val,ax
.exit
read proc near
push bx
push cx
mov cx,10
mov bx,0
read1:
mov ah,1
int 21h
cmp al,'0'
jb read2
cmp al,'9'
ja read2
sub al,'0'
push ax
mov ax,bx
mul cx
mov bx,ax
pop ax
mov ah,0
add bx,ax
jmp read1
read2:
mov ax,bx
pop cx
pop bx
ret
read endp
endTop
3 楼showtime84(幻想VS失落)回复于 2005-06-15 17:42:00 得分 0
楼上的二位老大,我的重点是,我的先转换成二进制再相加或相减和思路可行吗? 并不是我不会转换成二进制..........
谢谢!Top
4 楼zara(Kyrie eleison)回复于 2005-06-15 19:24:55 得分 0
当然可用的, 这样的方法, 对于计算而言, 是最简单的Top
5 楼showtime84(幻想VS失落)回复于 2005-06-15 19:36:52 得分 0
to:mydo
我想问一下*10是用你的方法执行速度快还是 用移位指令和加法指令执行快呢?
Top
6 楼showtime84(幻想VS失落)回复于 2005-06-15 19:37:45 得分 0
to:zara
我关键是找不到我程序在那里错了,结果总是不对!
我再去看看,实在不行就只有把源程序发上来,请教大家了!Top
7 楼zara(Kyrie eleison)回复于 2005-06-15 19:44:15 得分 0
这个问题, 在转换那里置断点, 看看转换后的结果是否正确就知道了. 结果对的话, 就是后面的计算有问题, 结果不对, 当然就是转换部分有 bug 了Top
8 楼showtime84(幻想VS失落)回复于 2005-06-15 19:59:38 得分 0
我初学,不会置断点............Top
9 楼showtime84(幻想VS失落)回复于 2005-06-15 20:01:46 得分 0
data segment
result dw ?
putbuf1 db 5,0,5 dup (?) ;定义二个输入缓冲区
putbuf2 db 5,0,5 dup (?)
data ends
stack segment para stack 'stack'
tpan db 100 dup (?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov dx,offset putbuf1 ;输入第一个十进制数
mov ah,0ah
int 21h
mov si,offset putbuf1
inc si
mov cx,[si]
inc si
call zhuanhuan ;转换后结果在ax中
mov bx,ax
mov dx,offset putbuf2 ;输入第二个十进制数
mov ah,0ah
int 21h
mov si,offset putbuf2
inc si
mov cx,[si]
inc si
call zhuanhuan
add bx,ax
exit: mov result,bx式 ;存结果
ret
main endp
zhuanhuan proc
push bx
push cx
push si
xor ax,ax
xor bx,bx
again: add ax,ax ; ax*10
mov dx,ax
add ax,ax
add ax,ax
add ax,dx
mov bl,[si]
and bl,0fh
add ax,bx
inc si
loop again
pop si
pop cx
pop bx
ret
zhuanhuan endp
code ends
end mainTop
10 楼showtime84(幻想VS失落)回复于 2005-06-15 20:02:46 得分 0
我已将程序精减到只剩最后的主框架了,希望不要花费你们太长的时间,帮我看一下错误在那里!
我求不到最后的正确结果!Top
11 楼top_mao()回复于 2005-06-15 20:04:06 得分 0
to楼主:
程序基本上每个人看看书都可以写出来,关键是你要你要有思路,遇到bug,要懂得哪里可以出错,懂得用tools,解bug。就如,你那条程序,你没有想过用debug,跟踪程序吗???你的程序挺少的,步步跟踪也不会难的。
慢慢试吧。如果不会用debug,那你可以花28元买本王爽的《汇编语言》来看看吧,那里说的很长细。Top
12 楼showtime84(幻想VS失落)回复于 2005-06-15 20:06:59 得分 0
我的书上debug就一带而过,所以我根本就不会什么跟踪调试什么的!
Top
13 楼zara(Kyrie eleison)回复于 2005-06-15 21:19:00 得分 0
...
mov dx,offset putbuf1 ;输入第一个十进制数
mov ah,0ah
int 21h
mov si,offset putbuf1
inc si
mov cx,[si] ;** 问题在这里吧. cx 是 word, 而那个长度域是 byte
inc si
call zhuanhuan ;转换后结果在ax中
mov bx,ax
...
; 上面的这个问题的解决, 一是可用先置 cx 为 0, 再 mov cl, byte ptr [si]
; 也可以在程序开始时加上:
.model small
.386
然后, 将那条指令替换为 movzx cx, byte ptr [si]
第二个操作数也是一样的问题Top
14 楼showtime84(幻想VS失落)回复于 2005-06-15 21:36:21 得分 0
我真要晕掉了,原来错误在那里,可是为什么汇编时不报类型不匹配的错误呢?
如果mov [si],al 这样汇编时就会报错, 我对这部分有点不是太明了,希望能指导一下,谢谢!Top
15 楼showtime84(幻想VS失落)回复于 2005-06-15 21:55:21 得分 0
真是太感谢了,我的那个类似于计算器的程序,原来错误就在这么一个小小的地方!
再次感谢zara,另外开个贴子散分给你,谢谢!Top
16 楼zara(Kyrie eleison)回复于 2005-06-15 21:58:39 得分 0
[si] 处的类型, 不是编译程序能够确定的, 这个是我们在使用 int21h 的 0ah 功能时规定的. 所以, 汇编时不一定能报错误. 究竟是否报错, 和 si 前面是否有使用约定有关, 如果, 前面有 assume si:PTR BYTE 说明 si 是指向 byte 类型的, 那么 mov cx, [si] 就会报错了. 另外, 可能和编译器的版本也有关系吧Top
17 楼zara(Kyrie eleison)回复于 2005-06-15 21:59:48 得分 0
谢谢! 不过, 不要另外开帖子了吧, 我现在还不怎么缺分的Top
18 楼showtime84(幻想VS失落)回复于 2005-06-15 22:10:09 得分 0
解决问题,完成了程序,高兴中,散分给大家!!Top




