【问题标题】:calculating arithmetic expressions in assembly x86在汇编 x86 中计算算术表达式
【发布时间】:2013-05-03 04:25:17
【问题描述】:

我有一个汇编 x86 问题

INCLUDE Irvine32.inc
.data
day WORD 0
month WORD 0
year WORD 0

count BYTE 0

prompt1 BYTE "enter month: ",0
prompt2 BYTE "enter day: ",0
prompt3 BYTE "enter an year: ",0
prompt4 BYTE " the day of the week is ",0
.code
main PROC

mov edx, OFFSET prompt1
call writeString
mov edx, 0
mov eax, OFFSET month
mov ecx, 19
call readInt
call crlf
mov eax, 0
mov ecx, 0

mov edx, OFFSET prompt2
call writeString
mov edx, 0
mov eax, OFFSET day
mov ecx, 19
call readInt
call crlf
mov eax, 0
mov ecx, 0

mov edx, OFFSET prompt3
call writeString
mov edx, 0
mov eax, OFFSET year
mov ecx, 19
call readInt
call crlf
mov eax, 0
mov ecx, 0

mov ebx, 0
mov ax, 14
sub ax, month
mov bx, 12
div bx
mov ebx, 0
sub year, ax
mov ecx, 0
mov cx, year


    exit
main ENDP

END main

所以我必须为这段代码做 2 个算术方程

a = (14 - month) / 12
y = year - a

这是我的输入

enter month: 4

enter day: 15

enter an year: 2013

我希望最后一条指令后 y 的值是 7dd(2013)

但是我得到寄存器ecx的值是0000FFFF,为什么y的值不是7dd,而是FFFF

谁能帮忙? 提前感谢

【问题讨论】:

  • 仔细看看除法的结果。

标签: assembly x86 masm arithmetic-expressions irvine32


【解决方案1】:

你要的答案,edx中会出现10decimal,eax会是0

mov ebx, 0

移动斧头,14

子斧头,月

mov bx, 12

div bx

10/12 = 0 在 eax 和 10 余数在 edx

【讨论】:

    【解决方案2】:
    INCLUDE Irvine32.inc
    .data
    day WORD 0
    month WORD 0
    year WORD 0
    
    
    prompt1 BYTE "enter month: ",0
    prompt2 BYTE "enter day: ",0
    prompt3 BYTE "enter an year: ",0
    prompt4 BYTE " the day of the week is ",0
    
    .code
    main PROC
    
    mov edx, OFFSET prompt1
    call writeString
    mov edx, 0
    call readInt
    call crlf
    mov month, ax
    
    mov eax, 0
    mov edx, OFFSET prompt2
    call writeString
    mov edx, 0
    call readInt
    call crlf
    mov day, ax
    
    
    mov eax, 0
    mov edx, OFFSET prompt3
    call writeString
    mov edx, 0
    call readInt
    call crlf
    mov year, ax
    
    
    
    mov eax, 0
    mov ebx, 0
    mov ax, 14
    sub ax, month
    mov bx, 12
    div bx
    mov si, ax ;; a store in si
    sub year, ax
    mov di, year ;; y store in di
    mov ax, ax
    mul bx
    add ax, month
    mov cx, 2
    sub ax, cx
    mov ecx, 0
    mov cx, ax ;; m store in cx
    
    mov eax, 0
    mov ebx, 0
    mov esp, 0
    mov ebp, 0
    
    add day, di
    mov ax, di
    mov bx, 4
    div bx
    add day, ax
    mov eax, 0
    mov ebx, 0
    mov ax, di
    mov bl, 100
    div bl
    mov ah, 0
    sub day, ax
    
    
    mov eax, 0
    mov ebx, 0
    mov dx, 0
    mov ax, di
    mov bx, 400
    div bx
    add day, ax
    mov bp, day  ;; temporary holder for d value up to y/400 calculation
    
    mov eax, 0
    mov ebx, 0
    mov ax, 31
    mul cx
    mov bx, 12
    div bx
    add bp, ax
    mov al, 7
    div al
    
    
    
    
        exit
    main ENDP
    
    END main
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2011-01-25
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多