装配x8086交换数组值

时间:2018-12-18 09:45:36

标签: assembly tasm emu8086

我有一个问题要编写一个将获取8个字符/数字的代码 它将在它们之间每2个字节交换一次。

示例:

输入451ABD45

ARR = | 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

NewARR = | 35 | 34 | 41 | 31 | 44 | 42 | 35 | 34

输出54A1DB54

我的代码:

STA SEGMENT STACK
    DB 100H DUP (0)
STA ENDS

DATA SEGMENT
    MSG DB 'Please Enter 8 Chars : $'
    DIM DW 10 DUP(?)
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STA
MAIN:
    MOV AX, DATA
    MOV DS, AX
    LEA DX, MSG
    MOV AH, 9H
    INT 21H
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
INPUT:
    MOV AH, 1H
    INT 21H
    MOV AH, 0
    MOV DIM[BX], AX
    INC BX
    LOOP INPUT
    MOV CX, 4
    MOV BX, 0
EXCHANGE:
    MOV DX, DIM[BX] ;0
    INC BX ;1
    MOV AX, DIM[BX] ;1
    DEC BX ;0
    MOV DIM[BX], AX ;0
    ADD BX, 1 ;1
    MOV DIM[BX], DX ;1
    INC BX
    LOOP EXCHANGE
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
PRINT:
    MOV DX, DIM[BX]
    INC BX
    MOV AH, 2H
    INT 21H
    LOOP PRINT
    MOV AX, 4C00H
    INT 21H
CODE ENDS
    END MAIN

My_input 451ABD45

ARR = | 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

MY_NewARR = | 35 | 34 | 41 | 35 | 44 | 41 | 35 | 44

My_output 54A5DA5D

我的代码有什么问题,谢谢您的帮助

1 个答案:

答案 0 :(得分:2)

您正在加载和存储单词(16位值),而每个字符是一个字节。

例如,在第一次迭代之前,您需要:

DateTimeOffset

在第一次迭代之后,您应该具有以下内容:

ZonedDateTime.ToDateTimeOffset

但是您最终要做的是:

ConvertToLocalTime

以此类推,其余的字符串。


固定且略为简化的交换循环如下所示:

return new ZonedDateTime(instant, timeZone).ToDateTimeOffset();