【问题标题】:MASM for 8086, symbol not defined: ffh [duplicate]8086 的 MASM,未定义符号:ffh [重复]
【发布时间】:2017-03-15 04:06:55
【问题描述】:

代码是:

.model small
.data
ar db ffh
.code
mov ax,@data
mov ds,ax
mov ah,00h
mov al,ar
mov bl,40h
clc
adc ax,bx
mov ah,4ch
int 21h
end
  1. 它在第 3 行抛出错误

    符号未定义:ffh

    我不明白它为什么不识别 a0h 这只是一个十六进制数字。

  2. 另外,请告诉我最后ax 是否会存储带进位的总和或不带进位的总和。因为我对adc 是通过自己的加法还是从上次影响进位标志的任何先前指令获取CF 感到困惑。

【问题讨论】:

  • 如果使用 h 后缀的十六进制数以字母 (a, b, c, d, e, f) 开头,则需要在前面加上 0(零)。所以ar db ffh 需要是ar db 0ffh
  • 使用之前设置的CFclc 清除进位标志。因此 adc 将始终添加 0(而不是 1)的值,因此在这种情况下相当于使用 add
  • adc 采用先前的 CF 值,以允许您添加任意位长数字。如果您对第一组位(最低有效/最低)执行add,那么您可以使用adc继续添加剩余的较高位组,这将使用前一组的CF,并为下一组设置CF,因此,超出“组”限制的位不会丢失,而是会进一步传播到更高的组中。最高有效位加法的最终溢出将是adc 指令链之后的最终 CF 值。
  • 非常感谢大家

标签: assembly x86 masm 16-bit


【解决方案1】:

使用 0ffh 因为如果你只写 ffh,汇编器会混淆它是数字还是变量名。

【讨论】:

    【解决方案2】:

    用 0ffh 代替 ffh,你会得到。

    这里是示例代码...

    .model 小

    .stack 64

    .数据

    ar db 0ffh
    

    .code

    主进程远

    mov ax,@data

    mov ds,ax

    mov ah,00h

    移动,ar

    mov bx,40h

    adc ax,bx

    mov ah,4c00h

    int 21h

    主端p

    结束主要


    ax 将存储最多 ffffh,也就是说,如果您在 ax 中添加两个数字,结果将大于 ffffh(十进制数为 65535),那么进位将包含 msb 数字。

    例如:

    mov ax,1234

    添加斧头,2345

    ;那么 ax 将有 1234+2345 = 3579

    但是如果

    mov ax,fffeh
    
    add ax,03h
    

    ;那么 ax 将有 0001 并且进位标志将包含 1.

    【讨论】:

    • 您遗漏了clc,因此您的代码取决于进入代码时的 CF 设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2011-09-30
    • 2012-10-07
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多