375906928 发表于 2012-12-8 21:59:46

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

下面的程序在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:
   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,   ;此处与下面一句表示: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:    ;字母放入低8位
   pop cx      ;颜色出栈
   mov ah,cl   ;颜色放入高8位
   mov es:,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,   ;此处与下面一句表示:cx的值
   mov ch,0   
   jcxz ok      ;若CX=0,跳转OK,否则继续执行
   mov al,ds:    ;字母放入低8位
   pop cx      ;颜色出栈
   mov ah,cl   ;颜色放入高8位
   mov es:,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的下一个语句继续执行

375906928 发表于 2012-12-8 22:23:51

来个高手拯救下- -、苦逼的骚年HOLD不住有木有~~
页: [1]
查看完整版本: debug能出所要的数值,但是CMD直接运行就不给了- -