Trong hợp ngữ, làm thế nào để xác định số âm ?

Nguyễn Minh Trung
(Nguyen Minh Trung)

New Member
Ai học hợp ngữ có thể giúp em làm bài này ?

Em đang làm một bài đếm số âm trong miền nhớ - dùng hợp ngữ, cụ thể ở đây là ASEM51, nhưng ASEM51 không quan trọng, chỉ cần thuật toán là đủ.

Vấn đề em thắc mắc là không biết 1 số 8 bit thì xác định âm dương kiểu gì, đây là bảng biểu diễn các số theo hệ hai, hệ hai có dấu và mã bù hai.

Trong máy tính, 255 nó biểu diễn là 1111 1111 mà -1 cũng là 1111 1111

2006-06-05_123801.jpg
 
Rõ ràng quá rồi còn gì.Bit đầu là dấu.0 là dương mà 1 là âm.Đem số AND cho 1x00(viết thế này đúng không nhỉ) nếu kết quả <> 0 là âm mà =0 là dương.
 
Chỉnh sửa lần cuối:
Lê Việt Bách đã viết:
Rõ ràng quá rồi còn gì.Bit đầu là dấu.0 là dương mà 1 là âm.

Em có học hợp ngữ không ? Anh kiểm tra, khi dùng 2 lệnh sau:
mov A,#255 ; chuyển giá trị +255 thập phân vào Acc
mov B,#-1 ; chuyển giá trị -1 thập phân vào B
thì cả A và B đều hiện là FF(H)
vậy lấy cơ sở nào để phân biệt nó là số âm hay dương ? :|

Đem số AND cho 1x00(viết thế này đúng không nhỉ) nếu kết quả > 0 là âm mà <0 là dương.
Nếu kết quả > 0 --> lại con gà quả trứng: thế nào là > 0 :p
 
Ầy nhẩy,từ từ đã nào.
Quan trọng là dương âm trong hệ nào ý chứ.unsigned thì không có số âm còn signed thì có âm dương.

Lâu ngày chả sờ đến nên không nhớ lắm.Kết quả là <>0 thì là âm mà =0 thì là dương.Hình như là có cái lệnh test rồi thì jz(jump if zero) hay sao ý.
 
Ở đây không có ai để ý vấn đề này ạ ? :(

Lê Việt Bách đã viết:
Ầy nhẩy,từ từ đã nào.
Quan trọng là dương âm trong hệ nào ý chứ.unsigned thì không có số âm còn signed thì có âm dương.

Lâu ngày chả sờ đến nên không nhớ lắm.Kết quả là <>0 thì là âm mà =0 thì là dương.Hình như là có cái lệnh test rồi thì jz(jump if zero) hay sao ý.
Chú ăn nói thiếu lễ độ quá đấy. Trả lời cũng hấp tấp, định khoe là mình có biết à ?
 
Chú ăn nói thiếu lễ độ quá đấy. Trả lời cũng hấp tấp, định khoe là mình có biết à ?
??Nếu anh thấy thế là thiếu lễ độ thì thôi,em sorry.Em trả lời đúng cái mà mình biết thôi,mong là giúp được gì đó,anh nghe hay không nghe thì thôi,việc gì mà cáu thế.Em biết cái gì thì có gì hay ho đâu mà phải khoe.Anh không thấy mỗi mình em là nhiệt tình reply à? :p
 
Chỉnh sửa lần cuối:
"Hệ số 10 tính theo mũ bù 2" ??? cái này có nghĩa gì?

Nếu mình nhớ ko nhầm thì giá trị được ghi trong RD(Register Destination) ở đây là A và B được lưu giữ với dạng là Two's Complement. Nếu chỉ với 8 bit, thì bạn chỉ có thể nhập số dương tới 127, nếu bạn nhập 255 vào đó, thì nó sẽ tự động chuyển thành -1. Thử với 128 và -128, hoặc -126 và 130 xem có đúng ra kết quả giống nhau không.
Nếu đúng như thế, thì có thể đếm số âm bằng cách đơn giản là bit đầu tiên bằng 1 thôi ( I([8]) = 1 )
Tớ ko biết nhiều lắm về ASS, chưa thử làm trên máy bao h cả, toàn làm bài viết :D, nên ko chắc lắm. Ấy thử mấy ví dụ trên xem thế nào.
 
Hiếu Minh: Okie vấn đề này tớ hiểu rồi, nó là quan niệm từ ban đầu của người dùng.

Nếu đưa cho tớ 1 vài ô nhớ có các giá trị sau: FFh, 01h, 02h, BCh ... không bảo gì thêm mà lại kêu đi đếm số âm dương thì chịu, bởi như đã nói ở trên, FFh có thể là 255 mà cũng có thể là -1.

Nhưng nếu bảo rằng chúng là mã bù hai, hoặc là số nhị phân có dấu, thì đương nhiên sẽ so sánh bit 7.
FFh = 1111 1111 B -> số âm
01h = 0000 0001 B -> số dương
02h = 0000 0010 B -> số dương
BCh = 1011 1100 B -> số âm

Tóm lại nó phụ thuộc vào cách đặt ban đầu.

Lê Việt Bach: Cảm ơn đã reply. Nhưng nói với người hơn tuổi không ăn nói trống không thế được.
 
Nguyễn Minh Trung đã viết:
Hiếu Minh: Okie vấn đề này tớ hiểu rồi, nó là quan niệm từ ban đầu của người dùng.

Nếu đưa cho tớ 1 vài ô nhớ có các giá trị sau: FFh, 01h, 02h, BCh ... không bảo gì thêm mà lại kêu đi đếm số âm dương thì chịu, bởi như đã nói ở trên, FFh có thể là 255 mà cũng có thể là -1.

Nhưng nếu bảo rằng chúng là mã bù hai, hoặc là số nhị phân có dấu, thì đương nhiên sẽ so sánh bit 7.
FFh = 1111 1111 B -> số âm
01h = 0000 0001 B -> số dương
02h = 0000 0010 B -> số dương
BCh = 1011 1100 B -> số âm

Tóm lại nó phụ thuộc vào cách đặt ban đầu.

Lê Việt Bach: Cảm ơn đã reply. Nhưng nói với người hơn tuổi không ăn nói trống không thế được.

Chú nhớ là có thể dùng offset hoặc bù-2 nhé. Hai cái này có cùng miền giá trị nhưng khác nhau về cách đọc số.
 
Lê Việt Bach: Cảm ơn đã reply. Nhưng nói với người hơn tuổi không ăn nói trống không thế được.

Chuyện đấy thì em xin lỗi vì không quen viết dài.
 
Chuyện số có dấu hay ko có dấu trong asm hoàn toàn tùy thuộc vào người viết, dùng lệnh nào thôi. Cụ thể như tiêu đề topic, giả sử có thanh ghi AX, muốn biết âm hay dương thì viết chẳng hạn :
cmp AX,0
jl âm
<trường hợp AX dương xử lý ở đây>
jmp tiếp
âm :
<AX âm thì xử lý ở đây>
tiếp: ...

Các lệnh xử lý so sánh có dấu là jl (Jump if Less than) jg (Greater), còn ko dấu là jb (Below) và ja (Above)
 
cái này em co biết, chính xác là em được học trong Discrete Maths.
No có 3 cách để code số trong máy tính:
1. Sign Modulus
2. One's Complement
3. Two's Complement
Cột "số hệ mười tương đương" của anh là đổi theo hệ binary bình thường (vd 1111 1111 =>1+2+4+8+16+32+64+128 =255 - cột đầu của anh ấy)
Cột "số hệ mười theo mã hệ 2 có dấu" chính là code theo qui tắc Sign Modulus (em sẽ giải thích sau)
Cột "số hệ mười theo hệ mã bù 2" chính là code theo qui tắc Two's Complement.
Nếu là số dương thì cả 3 cách code trên đều cùng 1 qui tắc:
- Bit đầu là cho âm dương: O là dương.
- Các bit tiếp theo để code theo hệ binary.
--> 0111 1101 = 1+4+8+16+32+64= +125

Nếu là số âm:
Sign modulus: Bit đầu là cho số âm : 1 là âm.
--> 1111 1111 = -(1+2+4+8+16+32+64) = -127 (cột 2 của anh ấy)
One's complement: từ số dương ta sẽ suy ra số âm theo qui tắc: đổi hết 0 thành 1 và ngược lại.
--> muốn biết 1111 1111 code cho số nào trong One's Complement, ta phải đổi 1111 1111 thanh 0000 0000, và số này là +0, nên 1111 1111 là -0.
Two's Complement: Biết số dương trong hệ 10 - ta tìm One's Complement của nó, rồi cộng với 1, ta sẽ có Two's Complement.
Vì thế:
+1 = 0000 0001 --> One's Complement: 1111 1110
1111 1110 + 1 = 1111 1111
--> Two's Complement:1111 1111 : sẽ code cho -1.
Thế nên 1111 1111 nó code cho 2 số khác nhau vì nó được code theo 2 cách khác nhau ah.
Nếu như cái nay ai cũng biết rồi, em nói ở đây mọi người bỏ qua cho (đưng bảo em tinh vi nhé)
 
Chỉnh sửa lần cuối:
He he, cảm ơn mọi người. Mình đã giải quyết được vấn đề rồi ;). Đây không phải là không hiểu số âm các loại viết kiều gì, mà là không hiểu chuyện quy ước ngay từ ban đầu của người lập trình thôi :D.
 
Back
Bên trên