【问题标题】:Using Jump and Compare in Assembly Language [duplicate]在汇编语言中使用跳转和比较
【发布时间】:2013-04-01 17:32:38
【问题描述】:

我在下面有这个计算器代码,它工作正常,但它不会跳到“除法”..我仍在学习汇编编程的过程中..需要帮助来解决这个问题...

.model 小 .stack 100h 。数据 msg1 db 13,10,13,10,“输入第一个数字:$” msg2 db 13,10,“输入第二个数字:$” msgEr db 13,10,“错误 $” msgCh db 13,10,“按 A 加,S 减,D 乘,F 减,X 退出:$” msgSum db 13,10,13,10, "总和是 : $" msgDif db 13,10,13,10,“区别是:$” msgDiv db 13,10,13,10,“商是:$” msgMul db 13,10,13,10, "产品是 : $" tmp 数据库? 。代码 开始: 移动斧头,@data mov ds, ax 铅 dx, msg1 mov 啊, 09h 整数 21 小时 移动 bx, 0 开始1: mov 啊, 01h 整数 21 小时 cmp al,0dh 下一个1 mov 啊,0 亚铝,30h 推斧 移动斧头,10d mul bx 流行音乐 添加 bx,ax 跳转开始1 下一个: 推bx 铅 dx,msg2 mov ah,09h 整数 21 小时 移动 bx,0 开始2: mov 啊,01h 整数 21 小时 cmp al,0dh 我的选择 mov 啊,0 亚铝,30h 推斧 移动斧头,10d mul bx 流行音乐 添加 bx,ax 跳转开始2 选择: 领导 dx, msgCh mov 啊, 09h 整数 21 小时 mov 啊, 01h mov 答案,人 整数 21 小时 cmp al,'f' je分割 cmp al,'a' je添加 cmp al,'s' je 减法 cmp al,'d' je 倍增 cmp al,'x' mov ah, 4ch 整数 21 小时 错误: 领导 dx,msgEr mov ah,09h 整数 21 小时 跳转开始 划分: 流行斧 div bx 推斧 领导 dx,msgDiv mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 添加: 流行斧 添加斧头,bx 推斧 领导 dx,msgSum mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 乘法: 流行斧 mul bx 推斧 领导 dx,msgMul mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 减去: 流行斧 子斧头,bx 推斧 引导 dx,msgDif mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 休息: div bx 推dx 移动 dx,0 公司 或斧头,斧头 休息 答: 流行音乐 添加 dl,30h mov 啊,02h 整数 21 小时 循环回答 跳转开始 结束开始

【问题讨论】:

  • 请详细说明。当您到达cmp al, 'f' 语句时,您是否真的在al 中有一个小写的“f”,然后跳转没有发生,或者它怎么不会跳转?
  • 另外... mov dx, 0div 之前!
  • 哦..我只是按照你说的添加'mov dx,0'并且它有效..如果可以的话你能解释一下这部分吗?谢谢
  • @SachiTekina: div bxdx:ax 中的32 位值除以bx 并将商存储在ax 中。如果商太大而无法放入ax - 如果dx 包含一些“随机”值可能会发生 - 你最终会出现除法溢出。这就是为什么你应该在除法之前清除dx

标签: assembly calculator x86-16


【解决方案1】:

您必须在执行操作之前清除 DX。 x86 中的除法将在DX:AX 上运行。如果你没有先清除它并且它有一些内容,你最终可能会出现溢出情况。显然,这很糟糕。 :)

所以:

dividing: 
pop ax
div bx

应该变成:

dividing: 
pop ax
mov dx,0
div bx

【讨论】:

    【解决方案2】:
    .model small
    .stack 100h
    
    .data
    msg1 db 13,10,13,10, "Enter 1st Number : $"
    msg2 db 13,10, "Enter 2nd Number : $" 
    msg01 db 13,10,13,10, "Enter base Number : $"
    msg02 db 13,10, "Enter power Number : $"
    msgEr db 13,10, "Error $"
    msgCh db 13,10, "Press A to ADD , S to SUBTRACT ,M to MULTIPLY, D to DIVIDE,F to FIND FACTORIAL,P to FIND X POWER Y, X to EXIT : $ "
    msgSum db 13,10,13,10, "Sum is : $"
    msgDif db 13,10,13,10, "Difference is : $"
    msgDiv db 13,10,13,10, "Quotient is : $"
    msgMul db 13,10,13,10, "Product is : $" 
    msgPOW db 13,10,13,10, "ANS is : $"
    tmp     db ?
    
    
    .code
    
    start:
    mov ax, @data
    mov ds, ax
    
    
    
    
    
    lea dx, msgCh
    mov ah, 09h
    int 21h
    
    mov ah, 1
    mov dl, al
    int 21h
    
    cmp al,'d'
    je dividing
    
    cmp al,'a'  
    je adding
    
    cmp al,'s'
    je subtracting
    
    cmp al,'m'
    je multiplying   
    
    cmp al,'f'
    je fact
    
    cmp al,'p'
    je x_pow_y
    
    cmp al,'x'
    mov ah, 4ch
    int 21h
    
    error:
    lea dx,msgEr
    mov ah,09h
    int 21h 
    jmp start
    
    ;//////////////////////////////////////
    
    dividing:
    lea dx, msg1
    mov ah, 9
    int 21h  
    
    start1:
    mov ah, 1
    int 21h
    cmp al,0dh      
    je next1
    mov ah,0        
    sub al,30h      
    push ax         
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start1      
    
    
    
    
    next1:
    push bx
    lea dx,msg2
    mov ah,09h
    int 21h
    
    
    mov bx,0
    
    
    start2:
    mov ah,1
    int 21h
    cmp al,0dh
    je d
    mov ah,0
    sub al,30h
    push ax
    mov ax,10d
    mul bx
    pop bx
    add bx,ax 
    jmp start2
    d:
    pop ax
    mov dx,0
    div bx
    push ax
    lea dx,msgDiv
    mov ah,09h
    int 21h 
    pop ax
    mov cx,0
    mov dx,0
    mov bx,10d
    jmp break
    
    
    
     ;///////////////////////////////////
    
    adding:  
    lea dx, msg1
    mov ah, 9
    int 21h
    mov bx, 0
    
    
    start01:
    mov ah, 1
    int 21h
    cmp al,0dh      
    je next01
    mov ah,0        
    sub al,30h      
    push ax         
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start01      
    
    
    
    
    next01:
    push bx
    lea dx,msg2
    mov ah,09h
    int 21h
    
    
    mov bx,0
    
    
    start02:
    mov ah,1
    int 21h
    cmp al,0dh
    je a
    mov ah,0
    sub al,30h
    push ax
    mov ax,10d
    mul bx
    pop bx
    add bx,ax 
    jmp start02 
    a:   
    pop ax
    add ax,bx   
    push ax
    lea dx,msgSum   
    mov ah,09h
    int 21h 
    pop ax
    mov cx,0
    mov dx,0
    mov bx,10d
    jmp break 
    
    
    
    
    ;///////////////////////////////  
    
    multiplying:
    
    lea dx, msg1
    mov ah, 9
    int 21h
    mov bx, 0
    
    start001:
    mov ah, 1
    int 21h
    cmp al,0dh      
    je next001
    mov ah,0        
    sub al,30h      
    push ax         
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start001      
    
    
    
    
    next001:
    push bx
    lea dx,msg2
    mov ah,09h
    int 21h
    
    
    mov bx,0
    
    
    start002:
    mov ah,1
    int 21h
    cmp al,0dh
    je m
    mov ah,0
    sub al,30h
    push ax
    mov ax,10d
    mul bx
    pop bx
    add bx,ax 
    jmp start002
    m: 
    pop ax 
    mov dx,0
    mul bx      
    push ax     
    lea dx,msgMul   
    mov ah,09h
    int 21h 
    pop ax
    mov cx,0
    mov dx,0
    mov bx,10d
    jmp break
    
    ;//////////////////////////////////  
    
    fact: 
    
    lea dx, msg1
    mov ah, 9
    int 21h
    mov bx, 0
    
    start003:
    mov ah, 1
    int 21h
    cmp al,0dh      
    je l
    mov ah,0        
    sub al,30h      
    push ax
    
    
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start003      
    
    
    l:                                       ;ax=6
    mov cx,bx
    mov ax,1 
    
    jmp l2
    l2:
    cmp cx,0
    je l1
    mov dx,0 
    mul cx
    
    push ax
    
    lea dx,msgPOW   
    mov ah,09h
    int 21h  
    
    sub cx,1
    pop ax
    
    jmp l2
    l1: 
    mov dx,0
    mov bx,10d
    jmp break 
    
    ;//////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\
    
    x_pow_y:
    
    
    lea dx, msg01
    mov ah, 9
    int 21h
    mov bx, 0
    
    start004:
    mov ah, 1
    int 21h
    cmp al,0dh
    
    je next004
    mov ah,0        
    sub al,30h      
    push ax         
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start004      
    
    
    
    
    next004:
    push bx
    lea dx,msg02
    mov ah,09h
    int 21h
    
    
    mov bx,0
    
    
    start005:
    mov ah,1
    int 21h
    cmp al,0dh
    je p
    mov ah,0
    sub al,30h
    push ax
    mov ax,10d
    mul bx
    pop bx
    add bx,ax 
    jmp start005 
    
    p:  
    mov cx,bx 
    
    pop ax
    mov bx,ax 
    mov dx,0
    
    
    c:
    cmp cx,1
    je c1
    mul bx      
    push ax     
    lea dx,msgPOW   
    mov ah,09h
    int 21h
    sub cx,1 
    pop ax
    jmp c
    c1:
    mov cx,0
    mov dx,0
    mov bx,10d
    jmp break
    
    
    
    
    
    
    
     ;/////////////////////////////// \\\\\\\\\\\\\\\\\\\\\ ' _ '
    
    subtracting: 
    lea dx, msg1
    mov ah, 9
    int 21h
    mov bx, 0
    
    start0001:
    mov ah, 1
    int 21h
    cmp al,0dh      
    je next0001
    mov ah,0        
    sub al,30h      
    push ax         
    mov ax,10d      
    mul bx          
    pop bx          
    add bx,ax       
    jmp start0001      
    
    
    
    
    next0001:
    push bx
    lea dx,msg2
    mov ah,09h
    int 21h
    
    
    mov bx,0
    
    
    start0002:
    mov ah,1
    int 21h
    cmp al,0dh
    je s
    mov ah,0
    sub al,30h
    push ax
    mov ax,10d
    mul bx
    pop bx
    add bx,ax 
    jmp start0002
    s:
    pop ax
    sub ax,bx 
    push ax
    lea dx,msgDif
    mov ah,09h
    int 21h 
    pop ax
    mov cx,0
    mov dx,0
    mov bx,10d
    
    break:
    div bx
    push dx
    mov dx,0
    inc cx
    or ax,ax 
    jne break 
    
    ans:        
    pop dx
    add dl,30h
    mov ah,02h
    int 21h
    loop ans
    
    jmp start
    
    end start
    

    【讨论】:

    • 使用编辑器功能将代码标记为代码,将文本标记为文本。这使您的帖子更具可读性。 :)
    • 如果你不说(在代码之外的文本中)出了什么问题,你做了什么改变,这个答案基本上是没用的。
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多