如何在程序集x86中将2位数字连接到数字

时间:2017-08-22 23:10:09

标签: assembly x86 x86-16

我在汇编中有这个任务来做一些游戏,对于这个游戏,我需要从数组中获取两个数字并将其设为一个数字,就像我有2, 3我需要进行它{{1} }, 我该怎么做?我真的不知道如何提供更多信息,如果你能告诉我如何帮助你,我将很高兴。

从注释我可以看到程序集可以保存字符串变量,我不知道该怎么做但我想它会容易得多,数组中的项是int值(我认为),这里是游戏代码:

23

这是数组的一部分:

IDEAL
MODEL small 
STACK 100h
DATASEG

CODESEG
Clock equ es:6Ch    ;Memory location of timer
ran db 0 
user_choice db 0 
computerscore db 0 
userscore db 0  
userw db 'you win',10,13,'$'
computerw db 'you lose',10,13,'$'
message db 5 dup (?)
lengthi dw ?
firstMsg db 'Enter the maximum number that the computer can draw (the max is 2 digits):',10,13,'$'
MACRO Random_Generator maxval
    mov ax,40h
    mov es,ax
    mov ax,[Clock]
    mov ah,[byte cs:bx]
    xor al,ah
    xor ah,ah
    and al,maxval
endm Random_Generator
proc lineBreak
    MOV dl, 10
    MOV ah, 02h
    INT 21h
    MOV dl, 13
    MOV ah, 02h
    INT 21h
    ret
endp lineBreak
start:
    mov ax, @data
    mov ds, ax
    ;;;;;;;;;;;;;;;;;;;;;;
    push seg firstMsg
    pop ds
    mov dx, offset firstMsg
    mov ah, 9h
    int 21h
    mov dx, offset message
    mov bx, dx
    mov [byte ptr bx], 3
    mov ah, 0Ah
    int 21h
    call lineBreak
    Random_Generator 9
    mov [ran],al
    mov ah,1
    int 21h
    sub al,30h
    ;mov [user_choice],al
    mov ah,[ran]
    cmp ah,al
    jne computerpoint
    inc [userscore] 
    mov dl,'*'
    mov ah,2
    int 21h
    cmp [userscore],1
    jb start
    je userwin
    computerpoint:
    inc [computerscore]
    cmp [computerscore],1
    jb start
    je computerwin
    userwin:
    call lineBreak
    push seg userw
    pop ds
    mov dx, offset userw
    mov ah, 9h
    int 21h
    jmp exit
    computerwin:
    call lineBreak
    push seg computerw
    pop ds
    mov dx, offset computerw
    mov ah, 9h
    int 21h
exit:
mov ax, 4c00h
int 21h
END start

如果重要,我需要用户的数字可以说明计算机可以绘制的最大数量

1 个答案:

答案 0 :(得分:0)

mov dx, offset message
mov bx, dx
mov [byte ptr bx], 3
mov ah, 0Ah
int 21h

如果目的是允许用户输入1位数字或2位数字,则将缓冲区大小限制为3就可以了。
需要做的是检查是否收到了数字和收到了多少位数。您将在[bx + 1]的第二个字节中找到此计数。

Input:
    mov  dx, offset message
    mov  bx, dx
    mov  byte ptr [bx], 3
    mov  ah, 0Ah
    int  21h
    mov  ax, [bx + 2]          ;Optimistically reading 2 digits
    sub  ax, "00"              ;Optimistically going from text to number
    cmp  byte ptr [bx + 1], 1  ;This byte could be 0, 1, or 2
    jb   Input                 ;Redo
    je   OneDigit
TwoDigits:
    xchg al, ah                ;Put tens in AH, put ones in AL
    aad                        ;Does AH * 10 + AL 
OneDigit:

您的最大号码现在位于AL