酸辣小白菜 发表于 2017-8-12 09:37:13

实验九交流

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
       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:00:11

本帖最后由 丶忘却的年少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:};如有问题可以追问

酸辣小白菜 发表于 2017-8-13 08:09:15

丶忘却的年少o 发表于 2017-8-12 14:00
如果你觉得没错请点"最佳答案";如有问题可以追问

你的代码编译不了,是我的编译器有问题还是你的代码有问题?   你成功运行了?

酸辣小白菜 发表于 2017-8-13 08:15:05

这是我那个程序运行结果,应该怎么修改程序?

酸辣小白菜 发表于 2017-8-13 09:20:17

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
       
       
       
       
       
       

这是修改后的,用了三个循环,只显示一行字

丶忘却的年少o 发表于 2017-8-13 09:24:56

酸辣小白菜 发表于 2017-8-13 08:15
这是我那个程序运行结果,应该怎么修改程序?


我的是在DOSBOX运行的,没问题。 我百度了下你的提示,好像是说如果你的汇编连接工具与DOS窗口环境不兼容,就可能会遇到这样的错误。你可以百度看看。

酸辣小白菜 发表于 2017-8-13 09:50:01

丶忘却的年少o 发表于 2017-8-13 09:24
我的是在DOSBOX运行的,没问题。 我百度了下你的提示,好像是说如果你的汇编连接工具与DOS窗口环境不兼 ...

这个是我结果运行不出来的那个程序?    哈哈 我太高兴了 ,程序没错呗意思就是,谢谢,我是新手,蛮有成就感的

丶忘却的年少o 发表于 2017-8-13 10:05:25

酸辣小白菜 发表于 2017-8-13 09:50
这个是我结果运行不出来的那个程序?    哈哈 我太高兴了 ,程序没错呗意思就是,谢谢,我是新手,蛮 ...

是的,我一模一样复制过来的。程序有什么不懂吗?主要还是理解它。记得点“最佳答案哦”{:10_332:}

酸辣小白菜 发表于 2017-8-13 10:10:16

丶忘却的年少o 发表于 2017-8-13 10:05
是的,我一模一样复制过来的。程序有什么不懂吗?主要还是理解它。记得点“最佳答案哦”

有    为什么我上面的用三个循环的程序,最后结果只有一行显示呢,你帮我看看,我就帮你最佳,嘿嘿

丶忘却的年少o 发表于 2017-8-13 10:22:04

酸辣小白菜 发表于 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了。

酸辣小白菜 发表于 2017-8-13 11:04:41

丶忘却的年少o 发表于 2017-8-13 10:22
这个我在 add ax,oah后面写了。就是说地址是段地址×16+偏移地址对吧,你加在ax然后给es的那就是段地址了 ...

噢啦,完全明白了

饼干焦糖 发表于 2018-1-30 21:52:22

能问下B8720h在程序中为什么能写成0B872h吗?
页: [1]
查看完整版本: 实验九交流