【问题标题】:Learning Assembly, Issue With Code?学习汇编,代码问题?
【发布时间】:2010-05-20 11:50:44
【问题描述】:
    jmp start
;==============================
;  Draws a horiz and vert line
;==============================
  startaddr dw 0a000h ;start of video memory
  colour db 1
;==============================
 start:
   mov ah,00
   mov al,19
   int 10h   ;switch to 320x200 mode
 ;=============================
 horiz:
   mov es, startaddr  ;put segment address in es ; <--- Error Line 14
   mov di, 32000  ;row 101 (320 * 100)
   add di, 75   ;column 76
   mov al,colour  ;cannot do mem-mem copy so use reg
   mov cx, 160   ;loop counter
  hplot:
    mov es:[di],al  ;set pixel to colour ; <--- Error
    inc di   ;move to next pixel
  loop hplot
 vert:
   mov di, 16000  ;row 51 (320 * 50)
   add di, 160   ;column 161
   mov cx, 100   ;loop counter
  vplot:
    mov es:[di],al  ; <--- Error
    add di, 320   ;mov down a pixel
  loop vplot
 ;=============================
 keypress:
   mov ah,00
   int 16h   ;await keypress
 end:
   mov ah,00
   mov al,03
   int 10h
   mov ah,4ch
   mov al,00   ;terminate program
   int 21h

我完全从this tutorial复制了这段代码。

使用 NASM 编译时出现三个错误(不使用参数,只使用-o output.exe):

14: Error: Invalid combination of opcode and operands
20: Error: Invalid combination of opcode and operands
28: Error: Invalid combination of opcode and operands

【问题讨论】:

  • 如果您突出显示有错误的行会很好

标签: assembly nasm


【解决方案1】:

请参阅 tanascius 对第 14 行问题的回答。您需要在此处使用mov es, word [startaddr]

第 20 和 28 行有一个共同的问题。 Nasm 需要语法mov [es:di],al。不需要大小前缀——它隐含在寄存器操作数中。

【讨论】:

    【解决方案2】:

    根据this yasm reference (see Memory references),您的 NASM 在确定引用的内存大小时可能会遇到问题:

    通常内存引用的大小可以通过您移动的寄存器来推断——例如,“mov [rax],ecx”是 32 位移动,因为 ecx 是 32 位。如果 YASM 无法确定您移动了多少内存,则当前会给出不明显的“操作码和操作数组合无效”错误。在这种情况下,解决方法是添加内存大小说明符:qword、dword、word 或 byte。

    这是一个 64 位内存移动,它设置从 rax 开始的 8 个字节:
    mov qword [rax], 1

    这是一个 32 位的内存移动,它设置了 4 个字节:
    mov dword [rax], 1

    这是一个 16 位内存移动,设置 2 个字节:
    mov word [rax], 1

    这是一个 8 位内存移动,设置 1 个字节:
    mov byte [rax], 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多