NASM JLE:如果Less或Equal总是评估为true,则跳转

时间:2013-11-19 19:22:20

标签: nasm conditional-statements

我这里的代码读取输入以确定矩阵/ 2d数组的尺寸,然后逐个读取数字。然后支持吐出最小的数字。

但是我的比较运算符似乎不起作用?我已经尝试将两者都作为寄存器,使用不同的变量等等但是由于某种原因,eax与数组中的第一个条目总是小于下一个数字,即使情况显然不是这样。

所以它总是跳过重新分配。

代码:直接跳到cmp eax,[num] 我的猜测是导致num的东西,或许它是如何声明的?总是比eax'更大',是否有额外的绒毛我不知道?

segment .bss
  num: resw 1 ;For storing a number, to be read of printed....
  nod: resb 1 ;For storing the number of digits....
  temp: resb 2
  matrix1: resw 200
  m: resw 1
  n: resw 1
  i: resw 1
  j: resw 1
  small: resb 4         ; temp variable
  buff resb 4

segment .data
  msg1: db "Enter the number of rows in the matrix : "
  msg_size1: equ $-msg1
  msg2:  db "Enter the elements one by one(row by row) : "
  msg_size2: equ $-msg2
  msg3: db "Enter the number of columns in the matrix : "
  msg_size3: equ $-msg3
  msg4: db "The Smallest Number is... : "
  msg_size4: equ $-msg4

  tab: db  9 ;ASCII for vertical tab
  new_line: db 10 ;ASCII for new line

segment .text

global _start

_start:

    ;; code for reading number of rows and columns, this works fine.
  mov eax, 4
  mov ebx, 1
  mov ecx, msg1
  mov edx, msg_size1
  int 80h
    ;; read in rows
  mov ecx, 0
  call read_num  
  mov cx, word[num]
  mov word[m], cx
  mov eax, 4
  mov ebx, 1
  mov ecx, msg3
  mov edx, msg_size3
  int 80h
    ;; read in columns
  mov ecx, 0
  call read_num  
  mov cx, word[num]
  mov word[n], cx
  mov eax, 4
  mov ebx, 1
  mov ecx, msg2
  mov edx, msg_size2
  int 80h
    ;; Reading in each element and storing it into the array
  mov esi, 0
  mov ebx, matrix1  
    ;; init loop
  mov word[i], 0
  mov word[j], 0

    ;; Outer loop
  i_loop:
    mov word[j], 0
    ;; Inner Loop
    j_loop:

    ;; A function
 call read_num
    ;; Result of that function is now stored int he matrix
 mov dx , word[num]
 mov  word[ebx + 2 * esi], dx 

 inc esi    ;Incrementing array index by one....
 inc word[j]
 mov cx, word[j]
 cmp cx, word[n]
 jb j_loop
    ;; End Inner Loop
    inc word[i]
    mov cx, word[i]
    cmp cx, word[m]
    jb i_loop
    ;; End Outer Loop

    ;;  Now begins the code to find the smallest number
    mov eax, [matrix1]
    ;; Moves first element of Matrix1 into eax

    ;;; saves eax into small
    mov [small], eax
  ;Loop through the matrix, check each number if its smaller than the first number in the array. AT the end print said number.

    ;Reading each element of the matrix.(Storing the elements in row major order).......
  mov esi, 0
  mov edi, matrix1

    ;; Reinit loop cters
  mov word[i], 0
  mov word[j], 0

    ;; Loop
  i_loop2:
    mov word[j], 0
    j_loop2:

   ;eax will contain the array index and each element is 2 bytes(1 word) long
   mov  dx, word[edi+2*esi]   ;
   mov word[num] , dx

    cmp eax,[num] ; compares eax and ebx
    jle   skip   ;if eax is SMALLER than ebx, we can safely skip reassignment
             ;as our current value is already smallest.
    mov eax, [num] ; stores new smallest number if the new number was smaller.
    mov [small], eax
    ;; reassignment code is always skipped.
    skip:

 inc esi
 inc word[j]
 mov cx, word[j]
 cmp cx, word[n]
 jb j_loop2

    inc word[i]
    mov cx, word[i]
    cmp cx, word[m]
    jb i_loop2

    ; code to output the smallest number
    ;;  Some ui text.
  mov eax, 4
  mov ebx, 1            
  mov ecx, msg4
  mov edx, msg_size4
  int 80h
  mov ecx, 0

    ;; Now the actual smallest number   
    mov eax, 4  ; system_write
    mov ebx, 1  ; stdout
    mov ecx, [small]    ; move smallest element to accumulator
    add ecx, 48         ; convert to ascii representation
    mov [buff], ecx     ; move to memory
    mov ecx, buff
    mov edx, 4          ; size, 4 bytes
    int 80h

exit:
  mov eax, 1
  mov ebx, 0
  int 80h

;Function to read a number from console and to store that in num 
read_num:

  pusha
  mov word[num], 0

  loop_read:
    mov eax, 3
    mov ebx, 0
    mov ecx, temp
    mov edx, 1
    int 80h

    cmp byte[temp], 10
      je end_read

    mov ax, word[num]
    mov bx, 10
    mul bx
    mov bl, byte[temp]
    sub bl, 30h
    mov bh, 0
    add ax, bx
    mov word[num], ax   

    jmp loop_read 
  end_read:
  popa

ret

1 个答案:

答案 0 :(得分:1)

哦,是的,几个小时的烦躁不安和这篇文章后几秒我弄明白了为什么。原来是的,我声明“num”的方式确实添加了额外的信息。我将它改为resb 4并且它可以工作。

Crabbaskets。