|
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
复制代码
本帖最后由 巅峰老甲鱼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,这可能会 ...
|