鱼C论坛

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

debug能出所要的数值,但是CMD直接运行就不给了- -

[复制链接]
发表于 2012-12-8 21:59:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的程序在DEBUG里面能出13666,但是在CMD运行就出299315578.。无解求调教=-=、
这个是汇编基础的实验10、写的有点坑、但是都是没看后面讲解和答案自己写的- -、写几个小时、、


assume cs:code,ds:data,ss:stack,es:table
data segment
  db 10 dup(0)
data ends
stack segment
  dw 10 dup(0)
stack ends
table segment
  dw 4000 dup(0)
table ends
code segment
start: mov ax,data
  mov ds,ax
  mov ax,12666
  call dtoc
  mov dl,3
  mov dh,8
  mov cl,2
  call show_str
  
  mov ax,4c00h
  int 21h
  
dtoc:  
  push ax
  push bx
  push cx
  push dx
  push si
  push di
s1:   mov cx,ax
   push cx
   jcxz ok1
   mov cx,10
   call divdw
   mov si,cx
   pop cx
   add si,30h
   push si
   inc bx
   jmp short s1
   
ok1:  pop cx
   mov cx,bx
   mov si,0
s2:   pop ds:[si]
   inc si
   loop s2
  pop di
  pop si
  pop dx
  pop cx
  pop bx
  pop ax
   ret
divdw:       ;输入dx,ax的32位被除数,cx的16位除数
  push bx
  push si
  push di
   
   push ax     ;将低16位被除数入栈保存
   mov ax,dx    ;将高16位被除数放入AX
   mov dx,0   
   div word ptr cx   ;进行高16位被除数的除法运算
   pop di     ;低16位被除数出栈放入DI
   push ax     ;高16位运算之后的商入栈保存
   mov ax,di   
   div word ptr cx   ;低16位被除数进行除法运算
   mov cx,dx    ;结果的余数放入CX
   pop dx     ;高16位的商放回DX
   
  pop di
  pop si
  pop bx
   ret     ;输出dx,ax的32位商,cx为余数
show_str:
  push ax
  push bx
  push cx
  push dx
  push di
  push si
   mov ax,0b800h   
   mov es,ax     ;es联上显存地址
   mov si,0
   mov di,0
s:   push dx
   push cx      ;cx表示颜色,入栈保存
   mov cl,[si]     ;此处与下面一句表示:cx的值
   mov ch,0     
   jcxz ok      ;若CX=0,跳转OK,否则继续执行
   push bx      ;BX作为目标地址ex变量,但是下面先用它来做乘法,入栈保存
    dec dh
    mov bl,dh     ;行数给予BL
    mov al,160     ;一行有160个字节
    mul bl      ;算出行起始位置
    mov dh,0     ;将DX高位清零,剩下地位就是列数
    dec dx
    add dx,dx     ;算出列的起始位置
    add dx,ax     ;算出起始位置
    mov di,dx
   pop bx      ;bx出栈
   mov al,ds:[si]    ;字母放入低8位
   pop cx      ;颜色出栈
   mov ah,cl     ;颜色放入高8位
   mov es:[di+bx],ax   ;颜色字母一起放入目的地址
   add bx,2
   inc si
   pop dx
   jmp short s     ;跳转回S循环
   
ok:   pop cx      ;此处把CX,DX出栈,否则返回的时候CS:IP指向出错
   pop dx
  pop si
  pop di
  pop dx
  pop cx
  pop bx
  pop ax
   ret       ;返回CALL的下一个语句继续执行
code ends
end start

---------------------------------------------------
后来我想着把显示子程序瘦身下,结果运行出来的是一堆笑脸- -打死找不到问题所在、救命呐TAT
show_str:
  push ax
  push bx
  push cx
  push dx
  push di
  push si
   mov ax,0b800h   
   mov es,ax     ;es联上显存地址
   mov bx,0     ;bx作为目的地址的偏移量
   mov si,0     ;si作为字母的偏移地址
   mov di,0
    dec dh
    mov bl,dh     ;行数给予BL
    mov al,160     ;一行有160个字节
    mul bl      ;算出行起始位置,放入ax中
    mov dh,0     ;将DX高位清零,剩下地位就是列数
    dec dx
    add dx,dx     ;算出列的起始位置
    add dx,ax     ;算出目的偏移起始位置
    mov di,dx     ;起始位置在di里面
s:   
   push cx      ;cx表示颜色,入栈保存
   mov cl,[si]     ;此处与下面一句表示:cx的值
   mov ch,0     
   jcxz ok      ;若CX=0,跳转OK,否则继续执行
   mov al,ds:[si]    ;字母放入低8位
   pop cx      ;颜色出栈
   mov ah,cl     ;颜色放入高8位
   mov es:[di+bx],ax   ;颜色字母一起放入目的地址
   add bx,2
   inc si
   jmp short s     ;跳转回S循环
   
ok:  
   pop cx      ;此处把CX出栈,否则返回的时候CS:IP指向出错
  pop si
  pop di
  pop dx
  pop cx
  pop bx
  pop ax
   ret       ;返回CALL的下一个语句继续执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-12-8 22:23:51 | 显示全部楼层
来个高手拯救下- -、苦逼的骚年HOLD不住有木有~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 00:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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