2009-07-14 34 views
12

Cú pháp lắp ráp để xác định xem hai số nào lớn hơn?lắp ráp để so sánh hai số

Mức thấp hơn (mã máy) cho nó là gì? Chúng ta có thể xuống thấp hơn không? Khi chúng tôi đạt đến mức độ bit, điều gì sẽ xảy ra? Làm thế nào là nó đại diện trong 0 và 1?

+4

Assembler Cú pháp và Máy Mã phụ thuộc vào kiến ​​trúc máy bạn đang sử dụng ... – Stobor

Trả lời

5

Nó khác với bộ lắp ráp. Hầu hết các máy cung cấp các thanh ghi có tên tượng trưng là như R1 hoặc EAX (Intel x86) và có hướng dẫn các tên như "CMP" để so sánh. Và để so sánh hướng dẫn , bạn cần một toán hạng khác, đôi khi là đăng ký, đôi khi là chữ. Những người lắp ráp thường là cho phép nhận xét ở bên phải hướng dẫn.

Một dòng hướng dẫn trông giống như:

<opcode> <register> <operand> ; comment 

lắp ráp của bạn có thể khác nhau đôi chút.

Đối với bộ kết hợp Microsoft X86, bạn có thể viết:

CMP EAX, 23; so sánh đăng ký EAX với hằng số 23

hoặc

CMP EAX, XYZ; so sánh EAX đăng ký với nội dung của vị trí bộ nhớ có tên XYZ

Thường thì người ta có thể viết các biểu thức phức tạp trong trường toán hạng cho phép hướng dẫn, nếu có khả năng, địa chỉ bộ nhớ theo nhiều cách khác nhau. Nhưng tôi nghĩ điều này trả lời câu hỏi của bạn.

+0

Bộ lắp ráp sẽ làm gì sau khi so sánh? Nó sẽ trả về một giá trị, đó là có thể sử dụng, và/hoặc lưu trữ một giá trị trong một đăng ký nhất định? –

+2

Khi lệnh CMP thực thi, trên hầu hết các máy, nó tạo ra kết quả ví dụ: "ít", "lớn hơn", "bằng" và đặt nó vào thanh ghi "điều kiện" đặc biệt. Lập trình viên thường viết một lệnh CMP, theo sau là "JMP trên điều kiện" (ví dụ, "JE" hoặc "jmp bằng nhau") kiểm tra các điều kiện đăng ký và làm cho luồng chương trình thay đổi thành tarfet của lệnh jmp nếu điều kiện là đúng . Người lắp ráp không phải làm gì cả; nó là trách nhiệm của chương trình để viết các hướng dẫn cái khác. Bộ ghép chỉ đơn thuần chuyển đổi từng dòng lệnh thành nhị phân. –

+0

à, được rồi! Cảm ơn lời giải thích. Đó là làm cho những gì tôi muốn làm dễ dàng hơn tôi nghĩ rằng nó sẽ là –

4

Lần đầu tiên một CMP (so sánh) hướng dẫn được gọi là sau đó một trong các cách sau:

jle - nhảy để lót nếu nhỏ hơn hoặc bằng
jge - nhảy để lót nếu lớn hơn hoặc bằng

Trình biên dịch thấp nhất làm việc với các byte, không phải bit (trực tiếp). Nếu bạn muốn biết về logic bit, bạn sẽ cần phải xem xét thiết kế mạch.

+0

không quên làm CMP register1, register2 trước khi thực hiện bước nhảy. MOV AX, 1; MOVE BX, 2; CMP AX, BX; JLE ở đâu đó .. –

4

Kỹ thuật cơ bản (trên hầu hết các hệ thống hiện đại) là trừ hai số và sau đó kiểm tra bit dấu của kết quả, nghĩa là kết quả lớn hơn/bằng/nhỏ hơn 0. Trong đoạn mã lắp ráp thay vì nhận được kết quả trực tiếp (vào một thanh ghi), bạn thường chỉ chi nhánh tùy theo bang:

; Compare r1 and r2 
    CMP $r1, $r2 
    JLT lessthan 
greater_or_equal: 
    ; print "r1 >= r2" somehow 
    JMP l1 
lessthan: 
    ; print "r1 < r2" somehow 
l1: 
+0

Có sự khác biệt về hiệu suất nào giữa các toán tử 'JLT' và' JMP' này không? – rejnev

4

Điều này phụ thuộc hoàn toàn vào bộ vi xử lý bạn đang nói về nhưng nó có xu hướng được các biểu mẫu:

cmp r1, r2 
ble label7 

Nói cách khác, một hướng dẫn so sánh để đặt cờ có liên quan, theo sau là nhánh có điều kiện tùy thuộc vào các cờ đó.

Mức độ này thường thấp như bạn cần để lập trình. Bạn chỉ cần biết ngôn ngữ máy cho nó nếu bạn đang viết các assembly và bạn chỉ cần biết các thiết kế vi mạch và/hoặc mạch nếu bạn đang xây dựng các bộ vi xử lý.

1

Như đã đề cập, thường là so sánh được thực hiện thông qua phép trừ.
Ví dụ: X86 Assembly/Control Flow.

Ở cấp phần cứng có các mạch kỹ thuật số đặc biệt để thực hiện các phép tính, như adders.

3

Trong TASM (lắp ráp x86) nó có thể trông như thế này:

cmp BL, BH 
je EQUAL  ; BL = BH 
jg GREATER  ; BL > BH 
jmp LESS  ; BL < BH 

trong trường hợp này nó so sánh hai số 8bit mà chúng tôi tạm thời lưu trữ trong cao hơn và phần dưới của thanh ghi B. Ngoài ra có lẽ bạn cũng xem xét sử dụng jbe (nếu BL < = BH) hoặc jge/jae (nếu BL> = BH).

Hy vọng ai đó tìm thấy nó hữu ích :)

+0

Cảm ơn, thẳng về phía trước, cho thấy bằng nhau lớn hơn, ít hơn, cũng chỉ thấy trong ý kiến ​​của bạn cho lớn hơn bình đẳng và ít hơn –

-2
input password program 
.modle small 
.stack 100h 
.data 
s pasword db 34 
input pasword db "enter pasword","$" 
valid db ? 
invalid db? 
.code 
mov ax, @ data 
mov db, ax 
mov ah,09h 
mov dx, offest s pasword 
int 21h 
mov ah, 01h 
cmp al, s pasword 
je v 
jmp nv 
v: 
mov ah, 09h 
mov dx, offset valid 
int 21h 
nv: 
mov ah, 09h 
mov dx, offset invalid 
int 21h 
mov ah, 04ch 
int 21 
end 
+1

Điều này không thực sự trả lời câu hỏi cụ thể này. – Unihedron

0

Hãy so sánh hai số. Nếu nó bằng Yes "Y", nó sẽ in No "N" trên màn hình nếu nó không bằng nhau. Tôi đang sử dụng emu8086. Bạn có thể sử dụng lệnh SUB hoặc CMP.

MOV AX,5h 
MOV BX,5h 
SUB AX,BX 
JZ EQUALS 
JNZ NOTEQUALS 

EQUALS: 
MOV CL,'Y' 
JMP PRINT 

NOTEQUALS: 
MOV CL,'N' 

PRINT: 
MOV AH,2 
MOV DL,CL 
INT 21H 

RET 

enter image description here