汇编实验九问题求助啊
assume cs:codesg,ds:datasg,ss:stacksgdatasg segment
db 'welcome to masm!'
db 02h,24h,71h
datasg ends
stacksg segment
dw 8 dup(0)
stacksg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,0b872h
mov bx,0
mov cx,3
s0:push cx
push ax
push bx
mov es,ax
mov si,0
mov di,0
mov cx,16
s:mov al,ds:
mov es:,al
pop bx
mov al,ds:
mov es:,al
inc si
add di,2
loop s
inc bx
pop ax
add ax,0ah
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
这个代码调试时会出现NTVDM CPU遇到无效命令,哪里错了?
本帖最后由 莫名其妙 于 2012-4-2 18:02 编辑
add ax,0ah下一行应该+160 是0a0h
mov cx,3
s0:push cx
push ax
push bx
mov es,ax
mov si,0
mov di,0
mov cx,16
s:mov al,ds:
mov es:,al
pop bx 循环里有pop 语句 这里会一直执行出栈操作 ,栈里的有用的数据只有前面push进去的所以 这里数据就乱了 你可以再循环外先pop bx 然后在进行循环
mov al,ds:
mov es:,al
inc si
add di,2
loop s
inc bx
pop ax
add ax,0ah
pop cx
loop s0
mov ax,4c00h
int 21h
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'welcome to masm!'
db 02h,24h,71h
datasg ends
stacksg segment
dw 8 dup(0)
stacksg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,0b872h
mov bx,0
mov cx,3
s0:push cx
;push axax的值没必要入栈,内循环中没有改变ax
;push bxbx的值没必要入栈,内循环中没有改变bx
mov es,ax
mov si,0
mov di,0
mov cx,16
s:mov al,ds:
mov es:,al
; pop bx
; 此处pop bx 在loop s循环时会将push cx行中入栈的cx值取出,导致错误
mov al,ds:
mov es:,al
inc si
add di,2
loop s
inc bx
;pop ax
add ax,0ah
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start 莫名其妙 发表于 2012-4-2 17:51 static/image/common/back.gif
add ax,0ah下一行应该+160 是0a0h
mov cx,3
那个。。add ax,0ahax保存的是段地址,在执行的时候合成物理地址时会自动左移一位再加上偏移地址,所以不能用0a0h 佐_鉺釘 发表于 2012-4-3 09:59 static/image/common/back.gif
那个。。add ax,0ahax保存的是段地址,在执行的时候合成物理地址时会自动左移一位再加上偏移地址,所以 ...
o 我理解错了!~ 经过反复思索,终于研究出来了附上代码:P
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'welcome to masm!'
db 02h,24h,71h
datasg ends
stacksg segment
dw 8 dup(0)
stacksg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,0b872h
mov es,ax ;定义第11行第32列的段地址,赋给es
mov cx,3 ;设置外循环次数
s0: push ax ;保存ax的值,即保存当前es的值
push cx ;保存外循环次数
mov si,0 ;si定位数据段的偏移地址
mov di,0 ;di定位显存中目的地址的偏移地址
mov cx,16 ;设置内循环次数
s: mov al,
mov es:,al ;复制字符串操作
mov al,ds:
mov es:,al ;复制颜色操作
inc si
add di,2
loop s
inc bx
pop cx ;取出外循环次数
pop ax
add ax,0ah
mov es,ax ;取出栈中ax的值,加上0ah,再赋给es,实现es指向下一行
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
页:
[1]