【问题标题】:Sum a byte array to ax register将字节数组求和到 ax 寄存器
【发布时间】:2020-04-18 01:39:31
【问题描述】:

我有一个关于将一字节数组求和到 ax 的问题,这是我的代码:

IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
    arr db 6 dup (200)
; --------------------------
CODESEG
start:
    mov ax, @data
    mov ds, ax
; --------------------------
    xor ax, ax
    add ax, [arr]
    add ax, [arr + 1]
    add ax, [arr + 2]
    add ax, [arr + 3]
    add ax, [arr + 4]
    add ax, [arr + 5]
; --------------------------

exit:
    mov ax, 4c00h
    int 21h
END start


汇编器返回“操作数类型不匹配” 我是组装新手,我该如何克服呢? 谢谢

【问题讨论】:

  • MASM 将您从自己手中拯救出来:您编写了一个带有 16 位内存源操作数的加法,该操作数将 2 个数组元素作为一个 16 位整数。做一个零扩展加载(如movzx cx, [arr])并将其添加到AX。
  • 当我执行 movzx 时,它显示“当前选定处理器的非法指令”(我在 8086 上工作)

标签: arrays assembly x86 cpu-registers tasm


【解决方案1】:

最终我这样做是为了解决我的问题:

IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
    arr db 6 dup (200)
; --------------------------
CODESEG
start:
    mov ax, @data
    mov ds, ax
; --------------------------
    xor ax, ax
    xor bh, bh
    mov bl, [arr]
    add ax, bx
    mov bl, [arr + 1]
    add ax, bx
    mov bl, [arr + 2]
    add ax, bx
    mov bl, [arr + 3]
    add ax, bx
    mov bl, [arr + 4]
    add ax, bx
    mov bl, [arr + 5]
    add ax, bx
; --------------------------

exit:
    mov ax, 4c00h
    int 21h
END start

【讨论】:

  • 是的,当您必须避免使用 80386 movzx 以兼容真正古老的 CPU 时,这是一种有效的零扩展方式。
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2014-12-26
  • 2015-02-12
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多