主题:大哥们这道题十万火急求求你们做一下
topzhengjie
[专家分:160] 发布于 2007-06-09 13:26:00
从键盘上输入 +/-A,+/-B,+/-C,三个三位符号数,求出(A+B)*C的值(ABC必须下于255,+/-表示正负)?
回复列表 (共2个回复)
沙发
liangbch [专家分:1270] 发布于 2007-06-11 23:49:00
这么长时间了,都没有人回帖,发个善心,给你写了一个完整的程序
.MODEL small
MAX_N equ 255
DATA SEGMENT
mess1 label byte
db 'a=?(-255<=a<=255)'
db 0dh,0ah
db '$'
mess2 label byte
db 'b=?(-255<=b<=255)'
db 0dh,0ah
db '$'
mess3 label byte
db 'c=?(-255<=c<=255)'
db 0dh,0ah
db '$'
mess4 label byte
db '(a+b)*c=$'
invalidInfo label byte
db 'invalid input$'
inbuff label byte
db 10
db 12 dup (?)
result label byte
db 32 dup (?)
strHead dw ?
var_a dw ?
var_b dw ?
var_c dw ?
DATA ends
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE segment ;byte public 'CODE'
ASSUME CS:CODE,DS:DATA,SS:STACK
_main proc near
@100:
MOV AX,DATA
MOV DS,AX
mov dx,offset mess1
mov ah,09h
int 21h
;input a string from console
mov dx, offset inbuff
mov si,dx
mov ah,0ah
int 21h
add si,2
xor ax,ax ;ax return value
call _atoi
cmp ax,255
jg thisEnd
cmp ax,-255
jl thisEnd
mov word ptr var_a,ax
@110:
; printf prompt string
mov dx,offset mess2
mov ah,09h
int 21h
;input a string from console
mov dx, offset inbuff
mov si,dx
mov ah,0ah
int 21h
add si,2
xor ax,ax ;ax return value
call _atoi
cmp ax,255
jg thisEnd
cmp ax,-255
jl thisEnd
mov word ptr var_b,ax
@120:
; printf prompt string
mov dx,offset mess3
mov ah,09h
int 21h
;input a string from console
mov dx, offset inbuff
mov si,dx
mov ah,0ah
int 21h
add si,2
xor ax,ax ;ax return value
call _atoi
cmp ax,255
jg thisEnd
cmp ax,-255
jl thisEnd
mov word ptr var_c,ax
@130:
mov ax,word ptr var_a
add ax,word ptr var_b
mov bx,word ptr var_c
imul bx
mov si, offset result
call _itoa ;字符串的实际长度存储在cx
mov si, offset result
add si, cx
mov byte ptr [si],0dh
mov byte ptr [si+1],0ah
mov byte ptr [si+2],'$'
mov dx,offset mess4
mov ah,09h
int 21h
mov dx,offset result
mov ah,09h
int 21h
mov ax,04c00h
int 21h ;结束程序
thisEnd:
; printf prompt string
mov dx,offset invalidInfo
mov ah,09h
int 21h
mov ax,04c00h
int 21h ;结束程序
_main endp
板凳
liangbch [专家分:1270] 发布于 2007-06-11 23:49:00
接上贴:
;转换si处的字符串为一个数,返回结果存储到ax寄存器
_atoi proc near
mov bp,10
mov ax,0
mov bx,0 ;bx=0,表示这个数正数或0,=1表示这是一个负数
mov cx,0
@200:
mov cl,byte ptr [si]
cmp cl,'+'
jnz @201
mov bx,0
inc si
jmp @200
@201:
cmp cl,'-'
jnz @202
mov bx,1
inc si
jmp @200
@202:
cmp cl,'0'
jb @220
cmp cl,'9'
ja @220
cmp ax,32767/10
jae @250
@210:
mul bp
sub cl,'0'
add ax,cx; register ch should be zero
cmp ax,MAX_N
ja @220
inc si
jmp @200
@220:
or bx,bx
jnz @221 ;bx=0,是正数,ax不变
ret
@221: ;bx=1, ax= - ax
mov cx,ax
mov ax,0
sub ax,cx
ret
@250:
mov ax,7fffh ;置ax为32767,表示这个数超范围
ret
_atoi endp
;转化一个正数(放在ax)为一个字符串,结果存储到si开始的缓冲区,ax的范围为-32768 to 32767
_itoa proc near
mov word ptr strHead,si
cmp ax,0
jge @301
mov cx,ax
mov ax,0
sub ax,cx
mov byte ptr [si],'-'
inc si
@301:
mov di,si ;di,第一个数字的位置
mov bp,10
@loopStart:
xor dx,dx ;置dx=0
div bp
add dl,'0'
mov [si],dl
inc si
cmp ax,0
jnz @loopStart
mov cx,si
sub cx,strHead ;cx:字符串长度
dec si ;si:字符串末地址
@inverse:
cmp di,si ;
jge @302
mov al,[di]
mov ah,[si]
mov [si],al
mov [di],ah
inc di
dec si
jmp @inverse
@302:
ret
_itoa endp
CODE ends
end _main
我来回复