汇编除法运算的问题

qq_18310569 2017-02-11 12:51:47
assume cs:code,ss:stack
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16

mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw

mov ax,4c00h
int 21h
divdw: push dx
push ax

mov ax,dx
mov dx,0
div cx
push ax ;H/N的商;结果的高16位
push dx ;H/N的余数

add sp,4
pop ax
div cx ;ax存储结果的低16位
mov cx,dx

sub sp,4
pop dx ;将结果的高16位出栈到dx
add sp,4
ret
code ends

end start









现在的问题是pop dx ;将结果的高16位出栈到dx;
dx的值始终和cs的值是一样的,不是存在栈里的0001H,用dosbox的debug结果如下:
...全文
514 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以用寄存器保存中间值。
qq_18310569 2017-02-13
  • 打赏
  • 举报
回复
引用 1 楼 baidu_29183065 的回复:
楼主按 t 的时候,debug本身不可避免会动用到栈,这也不是问题,完了追踪步骤后它自动会复原... 但问题是你的代码偏偏也动用到栈顶的资料,这就是灾难.... 其实简单的p就是了,你不去t,答案是对的
我在程序中定义了栈段,也就是相当于一段空白的栈对不?按道理说不会引起栈冲突的啊?该怎么理解呢?
baidu_23107797 2017-02-13
  • 打赏
  • 举报
回复
栈可以自定,但不是设计成随意修改sp+或sp-的时候又同时用t而不影响栈顶值
baidu_29183065 2017-02-11
  • 打赏
  • 举报
回复
其实divdw的写法是很可笑的,就是简单问题复杂化,sp最好少动为妙,这个副程序居然用了三条,实在叹为观止 下面的写法不用改sp, dx:ax是32bit的被除数,cx是除数,返回后dx:ax是商,cx是余数


 divdw:
     push bx
     push ax
     mov ax,dx
     mov dx,0
     div cx
     mov bx,ax
     pop ax
     div cx
     mov cx,dx
     mov dx,bx
     pop bx
 ret

baidu_29183065 2017-02-11
  • 打赏
  • 举报
回复
楼主按 t 的时候,debug本身不可避免会动用到栈,这也不是问题,完了追踪步骤后它自动会复原...
但问题是你的代码偏偏也动用到栈顶的资料,这就是灾难....
其实简单的p就是了,你不去t,答案是对的

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧