关于实验九,程序可以执行,但是一闪而过都不知道结果正不正确
本帖最后由 Sen哥 于 2013-12-14 21:42 编辑assume cs:data,ds:data,ss:stack
data segment
db 'Weloome to Masm!'
db 02h,24h,71h
data ends
stack segment
dd 8 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16h
mov ax,0b872h
mov es,ax
mov cx,3
s: push cx
mov cx,16
s1: mov al,ds:
mov es:,al
inc bx
add bp,2
loop s1
sub bp,bp
sub bx,bx
mov cx,16
s2: mov al,ds:10h
mov es:,al
add bp,2
loop s2
inc di
add bp,0ah
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
上面是源码,很蠢的方法,cmd运行很快返回了,看不到结果,求大神帮我看看我的代码哪里错了,谢谢!
我的也是那样,有时候能显示出来 没事了,知道什么回事了,当你不知道自己哪里错了,强烈推荐使用Emu8086软件,功能强大 如果你想让它在桌面停留一下,你可以在最后插入这个语句sysdem("pause");这样它就会停留在桌面,然后按任意键继续。 在Loop S后面插入一条 Jmp $或者是jmp start
这样就可以防止程序执行完毕就退出了!
还有一种,使用键盘中断int 16h 强烈推介!
这3中都是一句话,夹在Loop S后面
详细代码如下:
assume cs:data,ds:data,ss:stack
data segment
db 'Weloome to Masm!' db 02h,24h,71h data ends
stack segment
dd 8 dup (0) stack ends
code segment
start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,16h mov ax,0b872h mov es,ax mov cx,3s: push cx mov cx,16s1: mov al,ds: mov es:,al inc bx add bp,2 loop s1 sub bp,bp sub bx,bx mov cx,16s2: mov al,ds:10h mov es:,al add bp,2 loop s2 inc di add bp,0ah pop cx loop s jmp [ DISCUZ_CODE_22 ]nbsp; mov ax,4c00h int 21h code ends
end start第二种方法:跳转到头部!
assume cs:data,ds:data,ss:stack
data segment
db 'Weloome to Masm!'
db 02h,24h,71h
data ends
stack segment
dd 8 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16h
mov ax,0b872h
mov es,ax
mov cx,3
s: push cx
mov cx,16
s1: mov al,ds:
mov es:,al
inc bx
add bp,2
loop s1
sub bp,bp
sub bx,bx
mov cx,16
s2: mov al,ds:10h
mov es:,al
add bp,2
loop s2
inc di
add bp,0ah
pop cx
loop s
jmp start
mov ax,4c00h
int 21h
code ends
end start
第三种方法:相当于C语言的Getchar();
assume cs:data,ds:data,ss:stack
data segment
db 'Weloome to Masm!'
db 02h,24h,71h
data ends
stack segment
dd 8 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16h
mov ax,0b872h
mov es,ax
mov cx,3
s: push cx
mov cx,16
s1: mov al,ds:
mov es:,al
inc bx
add bp,2
loop s1
sub bp,bp
sub bx,bx
mov cx,16
s2: mov al,ds:10h
mov es:,al
add bp,2
loop s2
inc di
add bp,0ah
pop cx
loop s
int 16h ;16号键盘中断,按下任意键后才会继续往下执行!这样就起到了暂停作用,强烈推介使用这种方法!在书的最后一章有介绍!
mov ax,4c00h
int 21h
code ends
end start
求最佳! 不懂的可以加我QQ:1447380573
Sen哥 发表于 2013-12-14 23:00 static/image/common/back.gif
没事了,知道什么回事了,当你不知道自己哪里错了,强烈推荐使用Emu8086软件,功能强大
你试式不用调试器执行呀!这样照样不行! /se陈愉鑫/se 发表于 2013-12-15 19:01 static/image/common/back.gif
你试式不用调试器执行呀!这样照样不行!
是那个显示彩色字符串的实验吗,是的话,你是在什么操作系统上运行的啊,win7是不能显示出结果的;我的机器在win7上不能显示结果,我在虚拟机的xp上运行,结果显示正常
下面是自己的代码,与鱼老师的不太一样
;需要说明的是,王爽老师这本书的这个例子,好像不能在win下运行
;我是在虚拟机上装了xp来运行它的,显示正常,而在win7下,我的机器是显示不出什么的
assume cs:code,ds:data
;数据段
data segment
db 'hello my world!'
db 02h,24h,71h ;偏移位15
dw 0b872h,0b87ch,0b886h;代表11行,12行,13行的中间位置(显示字符串的地方)
;偏移为18
data ends
;代码段
code segment
start:
mov ax,data
mov ds,ax
;初始化
mov bx,0 ;来定位输出的位置
mov bp,0 ;来定位输出的属性
mov cx,3 ;外循环三次,即将’hello my world!‘以3中不同的属性输出3次(不同位置输出)
s1:
mov ax,ds:
mov es, ax
push cx ;保存外循环的值
mov si,0 ;原字符串
mov di,0 ;目标地址
mov cx,15;内循环,主要是输出15个字符’hello my world!‘
s2:
;填写ascII
mov al,ds:
mov es:,al
;设置属性
mov al,ds:
mov es:,al
inc si
add di,2
loop s2 ;进入内循环的下一次循环
add bx,2
inc bp
pop cx
loop s1 ;进入外循环的下一次循环
mov ax,4c00h
int 21h
code ends
end start 刚刚浏览了大神们的回答,他们说在win32系统下需要在debug下运行-g命令,不知道是不是这样!
页:
[1]