|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的下一个语句继续执行
|
|