【问题标题】:8086 Assembly errors8086 装配错误
【发布时间】:2014-04-15 22:34:09
【问题描述】:

我用 8086 汇编编写了这个程序,但我可能会遇到一些我不理解的错误。即在第 26 行和第 27 行,我收到错误“Illegal Immediate”,在第 31、37、38、43、44 行,我收到错误“无法转换为指针”。我是这种编程语言的新手,但我认为这些行是有效的。谁能阐明我可能做错了什么?非常感谢。

标题中的标题文件;程序名称 ;------------------------------------------------ ---------------------------------- stacksg segment para stack 'Stack' ;定义堆栈 db 32 dup (0) ;32 字节,可能要设置更大 stacksg 结束 ;------------------------------------------------ ---------------------------------- datasg 段 para 'Data' ;数据段 第一个分贝 0 第二分贝 1 loopit dw 12 datasg 结束 ;------------------------------------------------ ---------------------------------- codeg 段 para 'Code' ; 代码段 main proc far ;主程序 假设 ss:stacksg, ds:datasg, cs:codesg ;定义段寄存器 MOV AL, first ; 将 0 移入 AL MOV AH, second ; 将 1 移入 AH MOV CX,循环;将限制设置为 12(奇偶校验标志) MOV [200],AL ;将 0 移动到内存位置 200 MOV [201],AH ;将 1 移动到内存位置 201 MOV BL,202 ;将 200 移入 BL ADD AH, AL ; 0 和 1 相加,AH 还是 1 MOV [BL],AH ;将 1 移动到内存位置 202 INC BL ;递增 BL,BL 现在是 203 MOV CL,201 ;将 201 移入 CL MOV CH, 202 ;将 202 移入 CH ADD AH,[CL] ;加 1 和 1,AH 现在是 2 MOV [BL], AH ;将 2 移动到内存位置 203(间接通过 BL) INC BL ;递增 BL,BL 现在是 204 循环部分: INC CL ;增量 CL ADD AH,[CL] ;将内存位置 CL 中的内容添加到 AH MOV [BL], AH ; 将 BH 中的内容移动到内存位置(间接通过 BL) INC BL ;递增 BL 十二月 CX ;将 cx 减 1 jnz循环部分 main endp ;程序结束 代码结束 结束主要

【问题讨论】:

  • 地址不能用bl/cl,可以用bx/cx(不确定cx,可能是bp)
  • bx、si、di 和 bp(默认为 ss:bp)。不是cx(或其他人)。
  • 你仍然可以使用al = [bx + al] 和XLAT :)
  • 干掉那些cmets,它们一点用处都没有! MOV BL,202 ;moves 200 into BL 不正确,INC BL ;increments BL 表示流血明显。注释应该解释代码,而不是复制它!

标签: assembly fibonacci x86-16


【解决方案1】:
   Instruction Prefix                0 oder 1 Byte
   Segment Prefix                    0 oder 1 Byte
   Opcode                            1 oder 2 Byte
-> Mod R/M                           0 oder 1 Byte
   Displacement                      0, 1, 2 Byte
   Immediate                         0, 1, 2 Byte

-> Mod R/M-Byte = MM RRR MMM

MM  - Memeory addressing mode
RRR - Register operand address
MMM - Memoy operand address

RRR Register Names
Filds  8bit  16bit
000    AL     AX
001    CL     CX
010    DL     DX
011    Bl     BX
100    AH     SP
101    CH     BP
110    DH     SI
111    BH     DI

MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
100   DS       [SI]      [SI+o8]     [SI+o16]
101   DS       [DI]      [DI+o8]     [SI+o16]
110   SS       [o16]     [BP+o8]     [BP+o16]
111   DS       [BX]      [BX+o8]     [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多