实验十
assume cs:codedata segment
db 'Welcom to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
show_str:
mov ax,0b800h
mov es,ax
mov al,8 ;用8代dh为了,在其它程序用
mov ah,160
mul ah
mov cx,ax
mov al,3 ;用3代dl为了,在其它程序用
mov ah,2
mul ah
add cx,ax
mov di,cx
str: push cx
mov cl,
mov ch,0
jcxz ok
mov al,
mov es:,al
pop cx
mov es:,cl
add di,2
inc si
jmp short str
ok: pop cx
ret
code ends
end start
实验十,作上二个,第二个没作上来;
第三个,显示出来了 有一点问题:数是倒过来的:mad:
assume cs:code,ds:data
data segment
dw 123,1266,1,8,3,38
db 20 dup(0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
mov si,16
push si
s00:push cx
mov ax,
mov dx,10
s0: div dl
mov cl,ah
mov ch,0
jcxz s1
push ax ;保护ah
add ah,30h
mov ,ah
pop ax
mov ah,0
inc si
jmp s0
s1: add bx,2
pop cx
loop s00
pop si
call show_str
mov ax,4c00h
int 21h
show_str:
mov ax,0b800h
mov es,ax
mov al,8 ;用8代dh为了,在其它程序用
mov ah,160
mul ah
mov cx,ax
mov al,3 ;用3代dl为了,在其它程序用
mov ah,2
mul ah
add cx,ax
mov di,cx
str: push cx
mov cl,
mov ch,0
jcxz ok
mov al,
mov es:,al
pop cx
mov es:,cl
add di,2
inc si
jmp short str
ok: pop cx
ret
code ends
end start
原来这么简单,我歪曲了题义,题目一,当中给定了dh=8,dl=3;cl=2,后面,被我一顿乱改:lol:
还好,结果只有一点点偏离(行和列都没有减1)
RE: 实验十
<p>assume cs:code,ds:data,ss:stackdata segment
dw 123,12666,1,8,3,38,0,0
dw 32 dup(0)
data ends
stack segment
db 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,64
mov bx,0
mov dx,0
w0: mov ax, ;
mov cx,ax
jcxz s00
push ax
add bx,2
inc dx
loop w0
mov cx,dx
s00:
pop ax
call dtoc
loop s00
s01: mov dh,8 ;初始化显示位置
mov dl,3
mov cx,0cah
call show_str
mov ax,4c00h
int 21h
dtoc : push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10
mov dx,0 ;把用来存放余数的DX清零
div cx
mov cx,ax ;得到的商赋值给CX
jcxz s2 ;如果CX=0则跳到S1
add dx,30h ;余数加30H,得到相应的ASCII码
push dx ;保存到栈
inc bx
jmp short s1
s2: add dx,30h ;商为0时,余数为个位
push dx
inc bx ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov si,0
s3: pop ax ;s3实现将栈中的数据依次出栈,放到指定内存
mov ,al
inc si
loop s3
okay: pop bx
pop si
pop ax
pop cx
pop dx
ret
show_str:push cx ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色,ds:si指向字符串首地址
push si
mov ax,0b800h;显存的开始地址
mov es,ax ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al
mov ch,0 ;把CX高位置0
str: mov cl,ds: ;ds:指向‘Wlcome to masm!',0
jcxz ok ;当CL为0时,跳到ok处
mov es:,cl ;偶字节放字符
mov es:,al;奇字节放,颜色属性
inc si
add di,2 ;指向下个字符
jmp short str ;无条件跳转,jcxz是离开的关键跳!
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】
code ends
end start</p><p>
</p><p>第一次查看:进入DEBUG后,如图“第一次查看”</p><p>第二次查看:在“w0: mov ax, ;”第二次查看“</p><p>程序都变样了???? 这是怎么回事,求 助??
</p> 我写的代码段内容为何会变???求助??? 这是为什么呀?:sad
DOS 6.0 你们手里还有么? 用U盘进DOS运行下,看下什么样子 这样的事,总遇到 ,明明写一行代码,在执行的时候,直接跳过去,不知道为什么 assume cs:code,ss:stack,ds:data,es:data1
data segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 1993,1994,1995,0
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000,0
dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800,0
data ends
stack segment
db 64 dup(0)
stack ends
data1 segment
dd 80 dup(0)
data1 ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov ax,data1
mov es,ax
mov bx,0
mov bp,0
mov dx,0 ;用dx作次数
Sa: ;将年份或人数或平均值之一入栈
mov ax,
mov cx,ax
jcxz sa1 ;当Cx为0时,跳到s1处
push ax
mov ax,
push ax
add dx,2 ;一次循环压二次栈
add bx,4
inc bp
loop sa
mov cx,bp ;入栈次数给CX
sa1: ;将入栈的数据转化为ASC11码
pop dx
pop ax
push cx ;保护CX次数
mov si,82
call dtoc
sub si,di ;bi中放的是数据长度
mov di,0 ;长度清零
pop cx
inc cx
loop sa1
mov ax,4c00h
int 21h
divdw:;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push ax ;低16位先保存
mov ax,dx ;ax这时候的值是高16位了
mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
div cx ;H/N(16位除法)
mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
pop ax ;ax的值现在是L(低16位)
div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
mov cx,dx
mov dx,bx
ret
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
; ds:si指向字符串首地址
push cx
push si
mov ax,0b800h;显存的开始地址
mov es,ax ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al
mov ch,0 ;把CX高位置0
str: mov cl,ds: ;ds:指向‘Wlcome to masm!',0
jcxz ok ;当CL为0时,跳到ok处
mov es:,cl ;偶字节放字符
mov es:,al;奇字节放,颜色属性
inc si
add di,2 ;指向下个字符
jmp short str ;无条件跳转,jcxz是离开的关键跳!
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】
dtoc : ;抽取数字,并转化为SACII码
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10
;mov dx,0 ;把用来存放余数的DX清零
call divdw
; mov dx,cx ;r把余数给dx
;mov cx,ax ;得到的商赋值给CX
jcxz s2 ;如果CX=0则跳到S1
add cx,30h ;余数加30H,得到相应的ASCII码
push cx ;保存到栈
inc bx
jmp short s1
s2: add dx,30h ;商为0时,余数为个位
push dx
inc bx ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov di,cx ;本程序中,用来保存长度
mov si,82
s3: pop ax ;s3实现将栈中的数据依次出栈,放到指定内存
mov es:,al
inc si
loop s3
okay: pop bx
pop si
pop ax
pop cx
pop dx
ret
code ends
end start
上面是一个,没有完成的,程序;
当执行到第56行时,用P命令跳循环,会直接结束;
执行完56行,不执行58行,视58行如无物,晕死 用G 命令跳到58行,会死!
用G 命令跳到63行,则完全没问题;但会发现58行没有执行,cx=0000;晕死 haiouda 发表于 2014-8-29 21:06
58行为何不执行,求解? haiouda 发表于 2014-8-29 21:13
58行为何不执行,求解?
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么? 小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?
第一次赋值,是为了,接下来的一行,看是否到搂据尾了;
第二次赋值,是统计一共进栈多少次;
第二次赋值覆盖第一次赋值;
mov cx,ax
.
.
.
mov cx,bp
cx中应该是第二次的赋值,我是这么认为的。 小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?
在,二次给CX,赋值中间要加上一条,mov cx,0;这样应对了么? 小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?
我没有其它的计数器了,临时借用下DX 小靚同学Leon 发表于 2014-8-29 21:24
1. 47行为何要给cx反复赋值,这样循环可以能跳出来么?
2. 我有个疑问请示下:dx可以循环计数么?
谢谢,在二次给CX赋值中间加一条,MOV CX,0 ,就好了 assume cs:code,ss:stack,ds:data,es:data1
data segment
dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
dd 1993,1994,1995,0
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000,0
dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
dd 11542,14430,15257,17800,0
data ends
stack segment
db 64 dup(0)
stack ends
data1 segment
dd 80 dup(0)
data1 ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,128
mov ax,data1
mov es,ax
mov bx,0
mov bp,0
mov dx,0 ;用dx作次数
Sa: ;将年份或人数或平均值之一入栈
mov ax,
mov cx,ax
jcxz sa1 ;当Cx为0时,跳到s1处
push ax
mov ax,
push ax
add dx,2 ;一次循环压二次栈
add bx,4
inc bp
loop sa
mov cx,0
mov cx,bp ;入栈次数给CX
sa1: ;将入栈的数据转化为ASC11码
pop dx
pop ax
push cx ;保护CX次数
mov si,82
call dtoc
sub si,di ;bi中放的是数据长度
mov di,0 ;长度清零
pop cx
inc cx
loop sa1
mov ax,4c00h
int 21h
divdw:;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
push ax ;低16位先保存
mov ax,dx ;ax这时候的值是高16位了
mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
div cx ;H/N(16位除法)
mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
pop ax ;ax的值现在是L(低16位)
div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
mov cx,dx
mov dx,bx
ret
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
; ds:si指向字符串首地址
push cx
push si
mov ax,0b800h;显存的开始地址
mov es,ax ;ES中存放是显存的第0页(共0-7页)的起始段地址
mov al,160 ;每行80字符即160字节
dec dh ;第八行
mul dh
mov bx,ax
mov al,2 ;一个字符占二字节
dec dl ;列从零开始,第三列,所以减一
mul dl
add bx,ax ;此时BX中放的是行与列的偏移地址
mov di,0 ;di 指向显存的偏移地址
mov al,cl ;把颜色参数,放到al
mov ch,0 ;把CX高位置0
str: mov cl,ds: ;ds:指向‘Wlcome to masm!',0
jcxz ok ;当CL为0时,跳到ok处
mov es:,cl ;偶字节放字符
mov es:,al;奇字节放,颜色属性
inc si
add di,2 ;指向下个字符
jmp short str ;无条件跳转,jcxz是离开的关键跳!
ok: pop si
pop cx
ret ;显示字符串的子程序【定义结束】
dtoc : ;抽取数字,并转化为SACII码
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
s1: mov cx,10
;mov dx,0 ;把用来存放余数的DX清零
call divdw
; mov dx,cx ;r把余数给dx
;mov cx,ax ;得到的商赋值给CX
jcxz s2 ;如果CX=0则跳到S1
add cx,30h ;余数加30H,得到相应的ASCII码
push cx ;保存到栈
inc bx
jmp short s1
s2: add dx,30h ;商为0时,余数为个位
push dx
inc bx ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
mov cx,bx ;用CX出栈,把总进栈次数给CX
mov di,cx ;本程序中,用来保存长度
mov si,82
s3: pop ax ;s3实现将栈中的数据依次出栈,放到指定内存
mov es:,al
inc si
loop s3
okay: pop bx
pop si
pop ax
pop cx
pop dx
ret
code ends
end start
在二次给CX赋值,虽然不死机了,可以它还是乱跳,执行完56条就不知道跳哪去了,:dizzy: haiouda 发表于 2014-8-29 21:53
在二次给CX赋值,虽然不死机了,可以它还是乱跳,执行完56条就不知道跳哪去了,
你的循环体sa......loop sa这个地方原本是没有设置CX的,可能是CX的问题。我的建议是你在大循环外设置一个CX计数,mov cx,ax这条不要用到cx,jcxz这条重新找指令替换。多半是计数没找到,所以乱跳。 就是这个问题啦。。。
页:
[1]