sub bx,2处为何执行错误??
本帖最后由 17066038 于 2016-7-25 17:37 编辑我练习实验五(6)的代码编写,为何在sub bx,2处执行了预料之外的结果
我的思路是将 段(dw 1,2,3,4,5,6,7,8)做为栈,逐步弹出栈中元素到b段(dw 0,0,0,0,0,0,0,0)
开始时bx指向b段(dw 0,0,0,0,0,0,0,0)的最后一个元素,然后逐步bx=bx-2,实现逆序排列的
结果第一次执行到sub bx,2时就发生了错误,,求解。。。。。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:
mov ax,a
mov ss,ax
mov sp,0h
mov ax,b
mov ds,ax
mov bx,1eh
mov cx,8
s: pop ds:
sub bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
竟然直接执行完了{:10_257:} 我曹河蟹 发表于 2016-7-25 18:13
竟然直接执行完了
...勿灌水 mov ax,a
mov ss,ax
mov sp,0h
你是把数据pop到了a里面,而不是B里面。a里面的数据是满的 将 mov bx,1eh改成 mov bx,0eh,测试有搬运效果,但这题的要求是使用PUSH指令练习,直接用pop好像不太好吧 我把你的代码复制到我电脑上结果完美运行完了,一点问题也没出 正常执行,你可以尝试把bx=lf试试,不过不建议这样的做法,可以先入栈 用movsw 再出栈 这样可能编译器就能正常运行了 首先感谢大家的回复!
请注意程序的问题:
1、用-t执行到sub bx,2就直接中断了,无法继续了
2、用-g可以执行,但是执行后虽然01----08倒序排列好了,但是原来a段的数据被改变了
1、我觉得是数据段、栈段的问题,它们之间是不是有什么冲突,没有处理好
“”bx=lf试试“”应该是不合理的,因为字型数据肯定是双数为地址的,1f是单数,明显不对的
2、push的方法我做过了,很正常,但是我第一次是用pop做的,所有我就是想解决关于pop对于这个程序的问题,请大家围绕此代码本身给出意见,二而请勿讨论给出别的解决实现逆序存放的编程方法
3、重点:pop,问题出在哪里,期待 补充一下,bx=0eh,
也是不行的,sub bx,2依旧直接中断 将ss段中的数据pop到ds段中有问题吗?
pop ds:这个语法对吗???
如果对,sub bx,2;bx=bx-2语法有问题吗?
如果都对,中断为何????????
分享一下我做的实验9的代码
welcome to masm! 绿色
welcome to masm!绿底红字
welcome to masm!白底蓝字
调试成功!
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h ;黑底绿字,绿底红字,白底蓝字
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,0b800h
mov es,ax
mov bp,0
mov si,0
mov cx,3
mov cx,16
mov cx,3
s1: push cx
mov bx,0
mov di,0
mov cx,16
s: mov ax,ds:
mov es:,ax
mov ax,ds:
mov es:,ax
inc bx
add di,2
loop s
add bp,0a0h
inc si
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start 继续期待
sub bx,2处为何执行错误??
的高手解释 本帖最后由 17066038 于 2016-7-29 15:31 编辑
经过实验:
dos下 0b800:0000开始的前两行不能显示字符,字符是从第3行开始的,偏移地址要+320(每行80个字符160字节)才能正确显示程序中编写的字符
assume cs:code
data segment
db 1600 dup(61h,24h)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,1600
s2: mov ax,ds:
mov es:,ax
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
写入时要注意字型与字节型数据的对应
合理利用ax和al
11#楼的代码有这个问题的瑕疵,可以利用 word ptr 对应ax或者byte ptr 对应al
继续期待
sub bx,2处为何执行错误??
的高手解释 分享一下我练习实验10,8行3列显示绿色字符串,遇到0结束的代码
‘welcome to masm!’,0
assume cs:code
data segment
db 'welcome to masm!',0 ;32B
data ends
stack segment
dw 16 dup(0) ;32B
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,31
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:
push ds
push es
push si
push di
push ax
push bx
push cx
push dx
;求目标地址
mov ax,0b800h
mov es,ax
mov di,0
mov ax,0
mov al,160
dec dh ;从0行开始计数
add dh,2 ;显存从第3行开始显示
mul dh
add di,ax
mov ax,0
mov al,2
dec dl
mul dl
add di,ax
mov ah,cl
mov cx,0
;向目标地址写入数据
s: mov cl,ds:
jcxz show_str_ok
mov al,ds:
mov es:,al
mov es:,ah
inc si
add di,2
jmp s
show_str_ok:
pop dx
pop cx
pop bx
pop ax
pop di
pop si
pop es
pop ds
ret
code ends
end start sp设置错误.pop溢出
页:
[1]