汇编语言编程的练习题

在内存BUFF开始的单元中有十个带符号的字节型数据,正数存放到PLUS的缓冲区,负数存放到minus的缓冲区,编写完整的汇编语言源程序

您好,我思考了一会,使用Win32汇编语言实现了你的需求,您看下吧。

DATA SEGMENT
    BUFF DB 5, -2, 9, -7, 0, 3, -6, -1, 8, -4
    PLUS DB 10 DUP(?)
    MINUS DB 10 DUP(?)
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE, DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    
    MOV SI, OFFSET BUFF
    MOV DI, OFFSET PLUS
    MOV BX, OFFSET MINUS
    
    MOV CX, 10
    
LOOP_START:
    MOV AL, [SI]
        
    CMP AL, 0
    JGE POSITIVE
        
    MOV [BX], AL
    INC BX
    JMP NEXT
        
POSITIVE:
    MOV [DI], AL
    INC DI
        
NEXT:
    INC SI
    LOOP LOOP_START
    
    MOV AH, 4CH
    INT 21H
    
CODE ENDS

END START

作为一名二进制安全专业人员,十余年的老司机,看到汇编就已经迫不及待地翻译一遍了,给你翻译后的代码。

#include <stdio.h>

#define SIZE 10

int main() {
    char buff[SIZE] = {5, -2, 9, -7, 0, 3, -6, -1, 8, -4};
    char plus[SIZE];
    char minus[SIZE];
    int plusIndex = 0;
    int minusIndex = 0;

    for (int i = 0; i < SIZE; i++) {
        if (buff[i] < 0) {
            minus[minusIndex] = buff[i];
            minusIndex++;
        } else {
            plus[plusIndex] = buff[i];
            plusIndex++;
        }
    }

    printf("PLUS: ");
    for (int i = 0; i < plusIndex; i++) {
        printf("%d ", plus[i]);
    }

    printf("\nMINUS: ");
    for (int i = 0; i < minusIndex; i++) {
        printf("%d ", minus[i]);
    }

    return 0;
}