【问题标题】:x86 Asm Assembler . Difference between signed and unsigned - and 8 and 16 variablex86 汇编程序。有符号和无符号之间的区别 - 以及 8 和 16 变量
【发布时间】:2013-09-29 20:10:34
【问题描述】:

我必须编写一个汇编程序来计算 (a * (bc) * d) 其中 a, b, c, d 是以有符号 8 位格式存储在数据段中的变量。 (我必须假设结果表示为带符号的 32 位数字)

我写了以下代码

data segment

    a db 1
    b db 9
    c db 3
    d db 4 

    x dw ?


ends

stack segment
    dw   128  dup(0)
ends

code segment
start:

    mov ax, data
    mov ds, ax
    mov es, ax


    ; what would the difference be in the following three lines if the variables where signed?
    mov al, b
    sub al,c
    mul a
    mul d


    ;treating result as a 16bit - how about signed?
    mov x,ax 





    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start

我的问题如下: 除了注册表大小(al,ah,bh,bl,ecc ... 8bit),(ax,bx,cd,dx,16bit)之外,在将数字视为有符号和无符号时,我需要知道哪些区别?

除了将它存储到 DW 变量之外,我如何区别对待 32 位变量和 16 位变量?

为方便起见,我在代码的相关部分中编写了上述问题的简短版本。

有人可以帮帮我吗? 提前感谢您的宝贵时间。

【问题讨论】:

    标签: assembly x86 unsigned signed


    【解决方案1】:

    一般来说,寄存器/内存的内容只是位序列(具有特定长度),与有符号/无符号的概念无关。

    有一些说明说明运算符应被视为已签名还是未签名很重要。一些例子是:

    • 乘法:对无符号操作数使用MUL,对有符号操作数使用IMUL。
    • 除法:对无符号操作数使用DIV,对有符号操作数使用IDIV。
    • 条件跳转:JA 表示如果(无符号)高于则跳转,JG 表示如果(有符号)更大则跳转。 JB 表示如果(无符号)低于则跳转,JL 表示如果(有符号)低于则跳转,依此类推。

    ;treating result as a 16bit - how about signed?
    mov x,ax 
    

    MOV 没有符号的概念,它只是将位从源复制到目标。它只需要知道要复制多少位(即操作数的大小)。

    一个例外是,如果您使用的是扩大MOV:

    movzx ax,byte ptr [foo]  ; zero-extend the byte foo into ax (for unsigned numbers)
    movsx ax,byte ptr [foo]  ; sign-extend the byte foo into ax (for signed numbers)
    

    除了将它存储到 DW 变量之外,我如何区别对待 32 位变量和 16 位变量?

    DW 将用于 16 位变量。对于 32 位变量,您可以使用 DD。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多