注册 登录
编程论坛 汇编论坛

仅语法错误,望帮忙调试一下

神龙赖了 发布于 2013-02-21 20:00, 926 次点击
程序代码:
assume cs:code

data segment
    db 'Welcome to masm!',0
data ends

code segment
    start: 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 si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  al,cl
               mov  cl,0
              
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz out
                 mov byte ptr 0b800h:[dh][dl],ds:[si]  
                 inc si
                 mov 0b800h:[dh][dl].1,al
                 add dl,2
               jmp short print
      
          out: pop ax      
               pop cx
               pop dx
               pop si
            
               ret         
code ends

end start
如能改正错误分全部奉上,顺便问一下什么汇编编辑器最适于编写,我用的Masm for Windows 集成实验环境 2012.5结果发现版权比windows都封闭的十来倍,连错误中的英文都说要注册账户才能进行翻译,版面也稍有麻烦,qq1085250220如果有的话希望能发给我一个较实用的编辑器,一个问题50分,正好发发福利...
19 回复
#2
zklhp2013-02-21 20:30
以下是引用神龙赖了在2013-2-21 20:00:43的发言:

assume cs:code
 
data segment
    db 'Welcome to masm!',0
data ends
 
code segment
    start: 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 si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  al,cl
               mov  cl,0
               
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz out
                 mov byte ptr 0b800h:[dh][dl],ds:[si]   
                 inc si
                 mov 0b800h:[dh][dl].1,al
                 add dl,2
               jmp short print
      
          out: pop ax      
               pop cx
               pop dx
               pop si
              
               ret         
code ends
 
end start
如能改正错误分全部奉上,顺便问一下什么汇编编辑器最适于编写,我用的Masm for Windows 集成实验环境 2012.5结果发现版权比windows都封闭的十来倍,连错误中的英文都说要注册账户才能进行翻译,版面也稍有麻烦,qq1085250220如果有的话希望能发给我一个较实用的编辑器,一个问题50分,正好发发福利...
国产汇编IDE MASMPlus http://www.

只有本站会员才能查看附件,请 登录
再传一份到论坛罢
#3
zklhp2013-02-21 20:31
以下是引用zklhp在2013-2-21 20:30:16的发言:

国产汇编IDE MASMPlus http://www.

 再传一份到论坛罢

当然 没有神马翻译 因为编译器用的就是masm 原汁原味 优势是语法提示很好 小巧 缺点是没有调试功能
#4
神龙赖了2013-02-21 20:50
z版又来打劫啊...还有个问题能不能帮忙解决下,100分就送你了(再说我也收不回来了...)
#5
zklhp2013-02-21 20:51
程序代码:

assume cs:code

data segment
    db 'Welcome to masm!',0
data ends

code segment
    start: mov dh,8
           mov dl,3
           mov cl,2
           mov ax,data
           mov ds,ax
           mov ax, 0b800h
           mov es, ax
           mov si,0
           call show_str
         
           mov ax,4c00h
           int 21h
         
     show_str:
               push si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  al,cl
               mov  cl,0

          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 push cx
                 xor di, di
                 mov cl, dl
                 add di, cx
                 add cl, dh
                 add di, cx
                 mov ch, ds:[si]
                 mov byte ptr es:[di],ch
                 inc si
                 mov ch, ds:[si]
                 mov es:[di+1],ch
                 add dl,2
                 pop cx
               jmp short print
      
          _out: pop ax      
               pop cx
               pop dx
               pop si
            
               ret         
code ends

end start


其实改了也没用 逻辑明显是错的 ds:[dh][dl] 你以为这个东西和C语言里面的一样 其实 这个就相当于 ds:[dh+dl] 和C里面的完全不同

还有 你这个代码格式也不行 好多white space
#6
zklhp2013-02-21 20:52
在搬砖没时间给你看了 建议你认真看汇编的寻址部分 你对寻址的理解不够深刻

还有 代码格式注意下罢

祝好运 分给我好了
#7
神龙赖了2013-02-21 20:53
white space?
#8
神龙赖了2013-02-21 21:20
以下是引用zklhp在2013-2-21 20:51:34的发言:

 
assume cs:code
 
data segment
    db 'Welcome to masm!',0
data ends
 
code segment
    start: mov dh,8
           mov dl,3
           mov cl,2
           mov ax,data
           mov ds,ax
           mov ax, 0b800h
           mov es, ax
           mov si,0
           call show_str
           
           mov ax,4c00h
           int 21h
           
     show_str:
               push si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  al,cl
               mov  cl,0
 
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 push cx
                 xor di, di
                 mov cl, dl
                 add di, cx
                 add cl, dh
                 add di, cx
                 mov ch, ds:[si]
                 mov byte ptr es:[di],ch
                 inc si
                 mov ch, ds:[si]
                 mov es:[di+1],ch
                 add dl,2
                 pop cx
               jmp short print
      
          _out: pop ax      
               pop cx
               pop dx
               pop si
              
               ret         
code ends
 
end start


其实改了也没用 逻辑明显是错的 ds:[dh][dl] 你以为这个东西和C语言里面的一样 其实 这个就相当于 ds:[dh+dl] 和C里面的完全不同

还有 你这个代码格式也不行 好多white space
我是要dh+dl,只是想换着格式玩一玩...初学汇编,还有很多不太会的地方,不要见怪啊
jcxz _out加了个下划线怎么就能通过了呢?能不能说下缘由,还有
程序代码:
show_str:
               push si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  ax,es
               mov  es,ax
               mov  al,cl
               mov  cl,0
              
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 mov es:[dh+dl],ch
                 inc si
                 mov es:[dh+dl].1,al
                 add dl,2
               jmp short print

 mov es:[dh+dl],ch
还是出了语法错误,怎么会这样呢?
我觉得你可能没太明白我程序的意思,b800那段空间是彩字,高八位存属性,低八位存字符值,不是直接读取所有字符,当然如果我理解错了你理解错了也不要k我,新手新手...
(话说我发了一百分不多问几个问题不也太亏了,嘻嘻...)
#9
神龙赖了2013-02-21 21:31
求解答啊伟大的z版快快回来,我用铁头功把砖全砸了
#10
zklhp2013-02-21 21:47
以下是引用神龙赖了在2013-2-21 21:20:53的发言:

我是要dh+dl,只是想换着格式玩一玩...初学汇编,还有很多不太会的地方,不要见怪啊
jcxz _out加了个下划线怎么就能通过了呢?能不能说下缘由,还有 show_str:
               push si                      ;si记录字符串读取地址
               mov si,0
               push dx                      ;dh记录行地址
                                            ;dl记录列数地址
               push cx                      ;ch记录读取字符
               push ax                      ;al记录字符属性
               mov  ax,es
               mov  es,ax
               mov  al,cl
               mov  cl,0
               
          print: mov ch,ds:[si]                 ;如果ch为0,则跳出循环
          jcxz _out
                 mov es:[dh+dl],ch
                 inc si
                 mov es:[dh+dl].1,al
                 add dl,2
               jmp short print
 mov es:[dh+dl],ch
还是出了语法错误,怎么会这样呢?
我觉得你可能没太明白我程序的意思,b800那段空间是彩字,高八位存属性,低八位存字符值,不是直接读取所有字符,当然如果我理解错了你理解错了也不要k我,新手新手...
(话说我发了一百分不多问几个问题不也太亏了,嘻嘻...)

我也搞不懂了 什么属性 字符值啊 如果是这样 为啥还要用寻址呢 你的写法错是因为违反了8086的寻址规范 至于寻址规范是啥看书就明白了
#11
神龙赖了2013-02-21 21:51
刚刚找了金山奶爸,还剩下一个问题,为什么out前面加了下划线就过了呢?告诉了大大的有赏滴干活...
#12
zklhp2013-02-21 21:51
以下是引用神龙赖了在2013-2-21 21:51:09的发言:

刚刚找了金山奶爸,还剩下一个问题,为什么out前面加了下划线就过了呢?告诉了大大的有赏滴干活...

和保留字冲突 out in 是指令
#13
zklhp2013-02-21 21:52
建议你认真看书 你的这些语法错误书上都讲过

祝您学习愉快
#14
神龙赖了2013-02-21 22:15
只有本站会员才能查看附件,请 登录
ok,yes我过了,so happy!分给你了
#15
清微御宇2013-02-22 20:12
回复 8楼 神龙赖了
mov es:[dh+dl],ch
这个编译通过了?
#16
神龙赖了2013-02-22 20:15
程序我自己又改了一下...
#17
清微御宇2013-02-22 20:20
回复 16楼 神龙赖了
呵呵,贴出来看看,学习下王爽的实验8吧?
#18
神龙赖了2013-02-22 20:39
对啊,汇编好像没什么特别多的书,就看那本了
程序代码:
assume cs:code , es:data , ss:stack

data segment

  db 'welcome to masm!'

data ends

stack segment

  dw 8 dup (0)

code segment

  start:  mov ax,0b800h
          mov ds,ax
        
          mov ax,data
          mov es,ax
     
          mov bx,0
          mov si,40h
          mov cx,16
          mov ah,00000010b
          call print
          mov ah,00100100b
          call print
          mov ah,01111001b
          call print
            
           mov ax,4c00h
           int 21h

        print:  push bx
                push si
                push cx
            
          go:   mov al,es:[bx]
                mov ds:0f00h[si],al
                mov byte ptr ds:0f00h[si+1],ah
                add si,2
                inc bx
         loop go
              pop cx
              pop si
              add si,00A0h
              pop bx
              ret
code ends

end start

#19
清微御宇2013-02-22 22:26
回复 18楼 神龙赖了
嗯,四个数据寄存器只有BX可作为存储器指针使用的寄存器!
#20
神龙赖了2013-02-22 23:41
(⊙v⊙)嗯复习了下明白了
1