实验九交流
assume cs:code,ds:data,ss:stackdata segment
db 'welcome to masm! ';定义显示的字符
db 02h,24h,71h ;定义颜色
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0;suo yin yan se
mov ax,stack
mov ss,ax
mov sp,10h
mov ax, 0b872h
mov cx,3
s: push cx ;hang
push ax
push bx
mov si,0 ;suo yin zi fu
mov di,0 ; mu biao lie
mov es,ax
mov cx,10h
s1: mov al,ds:
mov es :,al
inc si
add di,2 ;fangzi
popbx
mov ax,ds:
mov di,1
mov es:,ax
add bx,1
add di,2 ;fang yanse
loop s1
pop ax
add ax,0a0h
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
错误改不出来,请大神指教
本帖最后由 丶忘却的年少o 于 2017-8-12 14:03 编辑
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!';定义显示的字符
db 02h,24h,71h ;定义颜色
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov ax,stack
mov ss,ax
mov sp,10h
mov ax, 0b872h
mov cx,3
s: push cx
push ax
push bx
mov si,0
mov di,0
mov es,ax
mov cx,10h
pop bx ;bx放在循环外面,否则每次都出栈把别的数据代入了
s1: mov al,ds:
mov es:,al
inc si
add di,1 ;此处+1,理由见注释1
mov al,ds: ;此处为al,一个字节
;mov di,1 删除这条,理由见注释1
mov es:,al ;此处也改为al
;add bx,1移到loop s1后面,理由见末尾注释2
add di,1 ;此处+1,前面已经把di定位到属性地址,+1就是ASCII地址
loop s1
add bx,1
pop ax
add ax,0ah ;这个ax是给es的,段地址是要×16的,所以只要给16就好了
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
;注释1:既然你上面有di,这里就不要重复定义了,直接加1到属性地址就好
;注释2:每一句是同一个颜色的;颜色就3种,要是放循环里会出界
如果你觉得没错请点"最佳答案"{:10_281:};如有问题可以追问 丶忘却的年少o 发表于 2017-8-12 14:00
如果你觉得没错请点"最佳答案";如有问题可以追问
你的代码编译不了,是我的编译器有问题还是你的代码有问题? 你成功运行了? 这是我那个程序运行结果,应该怎么修改程序? assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm! ';定义显示的字符
db 02h,24h,71h ;定义颜色
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0;suo yin yan se
mov ax,stack
mov ss,ax
mov sp,10h
mov ax, 0b872h
mov cx,3
s: push cx ;hang
push ax
push bx
mov si,0;suo yin zi fu
mov di,0; mu biao lie
mov es,ax
mov cx,10h
s1: mov al,ds:
mov es :,al
inc si
add di,2;fangzi
loop s1
popbx
mov al,ds:
inc bx
mov di,1
mov cx,10h
s2:mov es:,al
add di,2
loop s2
pop ax
add ax,0a0h
pop cx
loop s
mov ax,4c00h
int 21h
code ends
end start
这是修改后的,用了三个循环,只显示一行字 酸辣小白菜 发表于 2017-8-13 08:15
这是我那个程序运行结果,应该怎么修改程序?
我的是在DOSBOX运行的,没问题。 我百度了下你的提示,好像是说如果你的汇编连接工具与DOS窗口环境不兼容,就可能会遇到这样的错误。你可以百度看看。 丶忘却的年少o 发表于 2017-8-13 09:24
我的是在DOSBOX运行的,没问题。 我百度了下你的提示,好像是说如果你的汇编连接工具与DOS窗口环境不兼 ...
这个是我结果运行不出来的那个程序? 哈哈 我太高兴了 ,程序没错呗意思就是,谢谢,我是新手,蛮有成就感的 酸辣小白菜 发表于 2017-8-13 09:50
这个是我结果运行不出来的那个程序? 哈哈 我太高兴了 ,程序没错呗意思就是,谢谢,我是新手,蛮 ...
是的,我一模一样复制过来的。程序有什么不懂吗?主要还是理解它。记得点“最佳答案哦”{:10_332:} 丶忘却的年少o 发表于 2017-8-13 10:05
是的,我一模一样复制过来的。程序有什么不懂吗?主要还是理解它。记得点“最佳答案哦”
有 为什么我上面的用三个循环的程序,最后结果只有一行显示呢,你帮我看看,我就帮你最佳,嘿嘿 酸辣小白菜 发表于 2017-8-13 10:10
有 为什么我上面的用三个循环的程序,最后结果只有一行显示呢,你帮我看看,我就帮你最佳,嘿嘿
这个我在 add ax,oah后面写了。就是说地址是段地址×16+偏移地址对吧,你加在ax然后给es的那就是段地址了,所以它肯定会×16,会变成a0h的,就是你要的160,如果按照你写的那会变成1600(这里不懂可以看下面注释)。跑偏太多了,显示那肯定是显示的,就是不在你能看到的地方了。
注释:,懂了就不用看了,因为我语言能力不好,看了反而会跑偏!
你加了0a0h那最后就变成了b872+a0=b912,×16后地址就是b9120了,和你一开始定义的地址b8720相差了 b9120 - b8720 = a00,就是1600了,不是你想要的160了。 丶忘却的年少o 发表于 2017-8-13 10:22
这个我在 add ax,oah后面写了。就是说地址是段地址×16+偏移地址对吧,你加在ax然后给es的那就是段地址了 ...
噢啦,完全明白了 能问下B8720h在程序中为什么能写成0B872h吗?
页:
[1]