学习汇编,代码有问题吗?

发布于 2024-09-02 09:27:19 字数 1424 浏览 3 评论 0原文

    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

我完全从本教程复制了这段代码。

使用 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
    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

I copied this code exactly from this tutorial.

It comes up with three errors when compiling with NASM (using no parameters, only -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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

手心的海 2024-09-09 09:27:19

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

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

See tanascius' answer for the problem with line 14. You need mov es, word [startaddr] here.

Lines 20 and 28, have a common issue. Nasm requires the syntax mov [es:di],al. No size prefix is required -- it's implicit in the register operand.

贩梦商人 2024-09-09 09:27:19

根据此 yasm 参考(请参阅内存参考),您的 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 单词 [rax], 1

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

According to this yasm reference (see Memory references) your NASM could have a problem in determining the size of the memory referenced:

Usually the size of a memory reference can be deduced by which registers you're moving--for example, "mov [rax],ecx" is a 32-bit move, because ecx is 32 bits. YASM currently gives the non-obvious "invalid combination of opcode and operands" error if it can't figure out how much memory you're moving. The fix in this case is to add a memory size specifier: qword, dword, word, or byte.

Here's a 64-bit memory move, which sets 8 bytes starting at rax:
mov qword [rax], 1

Here's a 32-bit memory move, which sets 4 bytes:
mov dword [rax], 1

Here's a 16-bit memory move, which sets 2 bytes:
mov word [rax], 1

Here's an 8-bit memory move, which sets 1 byte:
mov byte [rax], 1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文