|
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,这可能会 ...
|