鱼C论坛

 找回密码
 立即注册
查看: 1521|回复: 1

[已解决]实验10,数值显示问题,运行div指令后就没反应了

[复制链接]
发表于 2023-7-10 22:42:06 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 loverinmydream 于 2023-7-11 07:53 编辑


  1. assume cs:code, ss:stack

  2. data segment
  3.   dw 6 dup (0)
  4. data ends

  5. stack segment
  6.   db 16 dup (0)
  7. stack ends

  8. code segment
  9. start:
  10.    mov ax, data
  11.    mov ds, ax
  12.    mov ax, stack
  13.    mov ss, ax
  14.    mov sp, 10h
  15.    mov si, 0
  16.    mov ax, 12666
  17.    call dtoc



  18.     mov ax, 4c00h
  19.     int 21h

  20.    
  21. ;功能:将word型数据转变为其十进制的字符串,以0结尾
  22. ;参数:ax:word型数据,ds:si:字符串首地址
  23. ;结果:无返回值
  24. dtoc:
  25.    mov bl, 10
  26.   ;获取每位数据
  27.    s0:
  28.      mov dx, 0
  29.      div bl                                 ;这里运行之后就没反应了

  30.    xor cx, cx
  31.    xor dx, dx
  32.    mov cl, al  ;商放入cl
  33.    mov dl, ah  ;余数放入dl
  34.    push dx
  35.    jcxz s1

  36.    xor ch, ch
  37.    mov ax, cx

  38.    jmp short s0
  39.    ;处理并移动数据
  40.    s1:
  41.      pop cx
  42.      jcxz ok1
  43.      add cx, 30h
  44.      mov ds:[si], cx
  45.      inc si
  46.      jmp short s1

  47.      ok1:
  48.        mov ds:[si], cx
  49.   ret

  50. code ends
  51. end start
复制代码


最佳答案
2023-7-10 22:42:07
本帖最后由 巅峰老甲鱼1 于 2023-7-11 11:22 编辑

这段汇编代码的目的是将一个16位的十进制数转换为字符串形式,并将结果存储在数据段的字符串数组中。代码的执行似乎出现了问题,导致运行div指令后没有反应。

在这段代码中,div指令用于将AX寄存器中的值除以BL寄存器中的值,商放入AL寄存器,余数放入AH寄存器。在执行div指令之前,应该确保BL寄存器的值不为0,否则会引发除以零异常。

另外,我注意到在调用dtoc过程之前,你使用了`mov si, 0`指令将SI寄存器置为0,这可能会导致字符串结果存储的位置不正确。你可以尝试使用合适的偏移地址来保存结果。

下面是修复后的代码,其中假设将字符串结果存储在data段的数组`result`中:

  1. assume cs:code, ds:data, ss:stack

  2. data segment
  3.   result db 7 dup (0) ; 用于存储结果的字符串数组
  4. data ends

  5. stack segment
  6.   db 16 dup (0)
  7. stack ends

  8. code segment
  9. start:
  10.    mov ax, data
  11.    mov ds, ax
  12.    mov ax, stack
  13.    mov ss, ax
  14.    mov sp, 10h
  15.    mov ax, 12666
  16.    call dtoc

  17.    mov ah, 4ch
  18.    int 21h

  19. ;功能:将word型数据转变为其十进制的字符串,以0结尾
  20. ;参数:ax:word型数据,ds:si:字符串首地址
  21. ;结果:无返回值
  22. dtoc:
  23.    mov bl, 10
  24.    xor cx, cx
  25.    xor dx, dx
  26. s0:
  27.    mov dx, 0
  28.    div bl

  29.    push dx
  30.    inc cx
  31.    test ax, ax
  32.    jnz s0

  33. s1:
  34.    pop dx
  35.    add dl, 30h
  36.    mov [result+si], dl
  37.    inc si
  38.    loop s1

  39.    mov byte ptr [result+si], 0 ; 字符串结尾标志
  40.    ret

  41. code ends
  42. end start
复制代码


这段代码修复了一些问题:

1. 添加了`ds:data`,指定数据段的段寄存器为DS,以便正确访问数据段中的数组。
2. 修改了存储结果的字符串数组的定义,将其命名为`result`,长度为7,以适应最大可能的结果长度。
3. 移除了多余的指令和标签,简化了过程。
4. 修复了将结果存储到字符串数组的问题,使用`[result+si]`来指定存储位置。

请注意,修改后的代码仅修复了已提及的问题,可能还存在其他潜在问题。确保在尝试执行任何汇编代码之前备份您的程序是很重要的。

最佳答案

查看完整内容

这段汇编代码的目的是将一个16位的十进制数转换为字符串形式,并将结果存储在数据段的字符串数组中。代码的执行似乎出现了问题,导致运行div指令后没有反应。 在这段代码中,div指令用于将AX寄存器中的值除以BL寄存器中的值,商放入AL寄存器,余数放入AH寄存器。在执行div指令之前,应该确保BL寄存器的值不为0,否则会引发除以零异常。 另外,我注意到在调用dtoc过程之前,你使用了`mov si, 0`指令将SI寄存器置为0,这可能会 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-10 22:42:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 巅峰老甲鱼1 于 2023-7-11 11:22 编辑

这段汇编代码的目的是将一个16位的十进制数转换为字符串形式,并将结果存储在数据段的字符串数组中。代码的执行似乎出现了问题,导致运行div指令后没有反应。

在这段代码中,div指令用于将AX寄存器中的值除以BL寄存器中的值,商放入AL寄存器,余数放入AH寄存器。在执行div指令之前,应该确保BL寄存器的值不为0,否则会引发除以零异常。

另外,我注意到在调用dtoc过程之前,你使用了`mov si, 0`指令将SI寄存器置为0,这可能会导致字符串结果存储的位置不正确。你可以尝试使用合适的偏移地址来保存结果。

下面是修复后的代码,其中假设将字符串结果存储在data段的数组`result`中:

  1. assume cs:code, ds:data, ss:stack

  2. data segment
  3.   result db 7 dup (0) ; 用于存储结果的字符串数组
  4. data ends

  5. stack segment
  6.   db 16 dup (0)
  7. stack ends

  8. code segment
  9. start:
  10.    mov ax, data
  11.    mov ds, ax
  12.    mov ax, stack
  13.    mov ss, ax
  14.    mov sp, 10h
  15.    mov ax, 12666
  16.    call dtoc

  17.    mov ah, 4ch
  18.    int 21h

  19. ;功能:将word型数据转变为其十进制的字符串,以0结尾
  20. ;参数:ax:word型数据,ds:si:字符串首地址
  21. ;结果:无返回值
  22. dtoc:
  23.    mov bl, 10
  24.    xor cx, cx
  25.    xor dx, dx
  26. s0:
  27.    mov dx, 0
  28.    div bl

  29.    push dx
  30.    inc cx
  31.    test ax, ax
  32.    jnz s0

  33. s1:
  34.    pop dx
  35.    add dl, 30h
  36.    mov [result+si], dl
  37.    inc si
  38.    loop s1

  39.    mov byte ptr [result+si], 0 ; 字符串结尾标志
  40.    ret

  41. code ends
  42. end start
复制代码


这段代码修复了一些问题:

1. 添加了`ds:data`,指定数据段的段寄存器为DS,以便正确访问数据段中的数组。
2. 修改了存储结果的字符串数组的定义,将其命名为`result`,长度为7,以适应最大可能的结果长度。
3. 移除了多余的指令和标签,简化了过程。
4. 修复了将结果存储到字符串数组的问题,使用`[result+si]`来指定存储位置。

请注意,修改后的代码仅修复了已提及的问题,可能还存在其他潜在问题。确保在尝试执行任何汇编代码之前备份您的程序是很重要的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 21:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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