鱼C论坛

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

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

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

data segment
  dw 6 dup (0)
data ends

stack segment
  db 16 dup (0)
stack ends

code segment
start:
   mov ax, data
   mov ds, ax
   mov ax, stack
   mov ss, ax
   mov sp, 10h
   mov si, 0
   mov ax, 12666
   call dtoc



    mov ax, 4c00h
    int 21h

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

   xor cx, cx
   xor dx, dx
   mov cl, al  ;商放入cl
   mov dl, ah  ;余数放入dl
   push dx
   jcxz s1

   xor ch, ch
   mov ax, cx

   jmp short s0
   ;处理并移动数据
   s1:
     pop cx
     jcxz ok1
     add cx, 30h
     mov ds:[si], cx
     inc si
     jmp short s1

     ok1:
       mov ds:[si], cx
  ret

code ends
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`中:
assume cs:code, ds:data, ss:stack

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

stack segment
  db 16 dup (0)
stack ends

code segment
start:
   mov ax, data
   mov ds, ax
   mov ax, stack
   mov ss, ax
   mov sp, 10h
   mov ax, 12666
   call dtoc

   mov ah, 4ch
   int 21h

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

   push dx
   inc cx
   test ax, ax
   jnz s0

s1:
   pop dx
   add dl, 30h
   mov [result+si], dl
   inc si
   loop s1

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

code ends
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,这可能会 ...
想知道小甲鱼最近在做啥?请访问 -> 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`中:
assume cs:code, ds:data, ss:stack

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

stack segment
  db 16 dup (0)
stack ends

code segment
start:
   mov ax, data
   mov ds, ax
   mov ax, stack
   mov ss, ax
   mov sp, 10h
   mov ax, 12666
   call dtoc

   mov ah, 4ch
   int 21h

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

   push dx
   inc cx
   test ax, ax
   jnz s0

s1:
   pop dx
   add dl, 30h
   mov [result+si], dl
   inc si
   loop s1

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

code ends
end start

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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