佐_鉺釘 发表于 2012-4-2 15:47:02

汇编实验九问题求助啊

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 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 17:51:48

本帖最后由 莫名其妙 于 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

hxs554f 发表于 2012-4-2 18:09:36

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-3 09:59:07

莫名其妙 发表于 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 10:00:43

佐_鉺釘 发表于 2012-4-3 09:59 static/image/common/back.gif
那个。。add ax,0ahax保存的是段地址,在执行的时候合成物理地址时会自动左移一位再加上偏移地址,所以 ...

o 我理解错了!~

佐_鉺釘 发表于 2012-4-5 13:46:06

经过反复思索,终于研究出来了附上代码: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]
查看完整版本: 汇编实验九问题求助啊