回 帖 发 新 帖 刷新版面

主题:大哥们这道题十万火急求求你们做一下

从键盘上输入 +/-A,+/-B,+/-C,三个三位符号数,求出(A+B)*C的值(ABC必须下于255,+/-表示正负)?

回复列表 (共2个回复)

沙发

这么长时间了,都没有人回帖,发个善心,给你写了一个完整的程序

.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

板凳

接上贴:

;转换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

我来回复

您尚未登录,请登录后再回复。点此登录或注册