loverinmydream 发表于 2023-7-10 22:42:06

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

本帖最后由 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:, cx
   inc si
   jmp short s1

   ok1:
       mov ds:, cx
ret

code ends
end start

巅峰老甲鱼1 发表于 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 , dl
   inc si
   loop s1

   mov byte ptr , 0 ; 字符串结尾标志
   ret

code ends
end start


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

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

请注意,修改后的代码仅修复了已提及的问题,可能还存在其他潜在问题。确保在尝试执行任何汇编代码之前备份您的程序是很重要的。
页: [1]
查看完整版本: 实验10,数值显示问题,运行div指令后就没反应了