鱼C论坛

 找回密码
 立即注册
查看: 477|回复: 4

[已解决]div1

[复制链接]
发表于 2023-8-13 18:25:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x




  1. assume cs:code

  2. data segment
  3.         db 10 dup(0)

  4. data ends

  5.   
  6. code segment
  7.       start:
  8.                 mov ax,12666
  9.                         mov bh,0
  10.                         mov bl,10
  11.                         div bl
  12.                        
  13.                         mov ax,4c00h
  14.                         int 21h
  15.           
  16.           
  17.           
  18.           
  19. code ends
  20. end start


复制代码








我的问题:如图    执行div bl 之后出现了问题    ??
最佳答案
2023-8-13 18:26:40
根据提供的代码,发现在执行 div bl 指令之前,将 ax 寄存器设置为 12666。然后使用 div 指令将 ax 的值除以 bl 的值。div 指令的作用是进行除法运算,并将商保存在 al 寄存器中,余数保存在 ah 寄存器中。

然而,在执行 div 指令之前,需要确保被除数的值 (即 ax 寄存器的值) 不超过除数的值。否则,将会出现除法溢出的错误。

根据你提供的代码,ax 寄存器的值为 12666,但是除数 bl 的值为 10。由于 ax 寄存器的值大于除数的值,会导致除法溢出错误。

解决该问题的方法是,确保被除数的值不超过除数的值。你可以通过将 ax 寄存器的值设为小于等于除数的值来解决这个问题。

以下是修改后的代码:

  1. assume cs:code
  2. data segment
  3.     db 10 dup(0)
  4. data ends

  5. code segment
  6. start:
  7.     mov ax, 1000    ; 修改此处,将 ax 寄存器的值设为小于等于除数的值
  8.     mov bh, 0
  9.     mov bl, 10
  10.     div bl
  11.     mov ax, 4c00h
  12.     int 21h
  13. code ends
  14. end start
复制代码


请注意,这只是根据你提供的代码进行的修改。如果你有其他要求或需要进一步的帮助,请提供更多细节。
如果问题已经解决,请设置最佳答案
1111.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-13 18:25:56 | 显示全部楼层
问题分析: 在给定的汇编代码中,问题出现在执行 div bl 指令之后。div 指令用于无符号除法,它将 AX 寄存器的值除以指定的操作数,并将商存储在 AL 寄存器中,余数存储在 AH 寄存器中。但是在这里,执行 div bl 后可能会导致除数为零的错误。

解决方案: 要确保在执行 div 指令之前,除数(即 BL 寄存器的值)不为零。

修改后的代码:
  1. assume cs:code
  2. data segment
  3.     db 10 dup(0)
  4. data ends
  5. code segment
  6. start:
  7.     mov ax, 12666
  8.     mov bh, 0
  9.     mov bl, 10
  10.     ; Check if divisor is zero
  11.     cmp bl, 0
  12.     je divisor_is_zero
  13.     div bl  ; Perform division
  14.     ; Output quotient and remainder
  15.     mov dl, al  ; Move quotient to DL register
  16.     add dl, '0' ; Convert quotient to ASCII character
  17.     mov ah, 02h ; Print character function
  18.     int 21h     ; Call DOS interrupt
  19.     mov dl, ah  ; Move remainder to DL register
  20.     add dl, '0' ; Convert remainder to ASCII character
  21.     int 21h     ; Call DOS interrupt
  22.     jmp end_program
  23. divisor_is_zero:
  24.     ; Handle division by zero error (you can customize this part)
  25.     ; Print an error message or perform other actions
  26. end_program:
  27.     mov ax, 4c00h
  28.     int 21h
  29. code ends
  30. end start
复制代码

修改解释:
1. 我们添加了一个代码块来检查除数是否为零(cmp bl, 0je divisor_is_zero)。如果除数为零,我们将跳转到一个处理除数为零错误的标签(divisor_is_zero)。
2. 在正常情况下,如果除数不为零,我们执行 div bl 指令,并将商和余数分别输出为 ASCII 字符。
3. 我们在 divisor_is_zero 标签处可以添加处理除数为零错误的代码,例如打印错误消息。

请根据您的需求自行调整和扩展这个代码示例。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 18:26:17 | 显示全部楼层
本帖最后由 isdkz 于 2023-8-13 18:40 编辑

问题出现在执行div bl之后。div指令是一个除法指令,它用于将一个16位的无符号数除以一个8位的数,并将商存储在AL寄存器中,余数存储在AH寄存器中。在这种情况下,我们将AX寄存器中的值12666除以BL寄存器中的值10。

根据给定的代码,我们可以看到在执行div指令之前,AX寄存器中的值为12666,BL寄存器中的值为10。执行div指令后,AX寄存器中的值将被除以BL寄存器中的值,商将存储在AL寄存器中,余数将存储在AH寄存器中。

然而,问题是在执行div指令之前,我们没有将AX寄存器中的值移动到DX寄存器中。在执行div指令之前,应该将AX寄存器中的值移动到DX寄存器中,以确保除法操作的正确性。

正确的代码应该是:

  1. assume cs:code

  2. data segment
  3.     db 10 dup(0)
  4. data ends

  5. code segment
  6. start:
  7.     mov ax, 12666
  8.     mov bh, 0
  9.     mov bl, 10
  10.     xor dx, dx ; 清空DX寄存器
  11.     div bl

  12.     mov ax, 4c00h
  13.     int 21h

  14. code ends
  15. end start
复制代码


通过在执行div指令之前清空DX寄存器,我们可以确保除法操作的正确性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 18:26:40 | 显示全部楼层    本楼为最佳答案   
根据提供的代码,发现在执行 div bl 指令之前,将 ax 寄存器设置为 12666。然后使用 div 指令将 ax 的值除以 bl 的值。div 指令的作用是进行除法运算,并将商保存在 al 寄存器中,余数保存在 ah 寄存器中。

然而,在执行 div 指令之前,需要确保被除数的值 (即 ax 寄存器的值) 不超过除数的值。否则,将会出现除法溢出的错误。

根据你提供的代码,ax 寄存器的值为 12666,但是除数 bl 的值为 10。由于 ax 寄存器的值大于除数的值,会导致除法溢出错误。

解决该问题的方法是,确保被除数的值不超过除数的值。你可以通过将 ax 寄存器的值设为小于等于除数的值来解决这个问题。

以下是修改后的代码:

  1. assume cs:code
  2. data segment
  3.     db 10 dup(0)
  4. data ends

  5. code segment
  6. start:
  7.     mov ax, 1000    ; 修改此处,将 ax 寄存器的值设为小于等于除数的值
  8.     mov bh, 0
  9.     mov bl, 10
  10.     div bl
  11.     mov ax, 4c00h
  12.     int 21h
  13. code ends
  14. end start
复制代码


请注意,这只是根据你提供的代码进行的修改。如果你有其他要求或需要进一步的帮助,请提供更多细节。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 20:23:22 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-13 18:25
问题分析: 在给定的汇编代码中,问题出现在执行 div bl 指令之后。div 指令用于无符号除法,它将 AX 寄存 ...

mov bl,10    bl肯定不是0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 03:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表