XLAT 3个查找表 [英] xlat with 3 lookup tables

查看:221
本文介绍了XLAT 3个查找表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图让这个code了一会儿现在的​​工作。我有看到如何使用3查找表的麻烦。有人能指出我在做什么错误,指出我在正确的方向。我想比较,所以我可以使用上,下,和数量。我找不到太多多个查找表。非常感谢您所提供的任何帮助。

  .MODEL小.STACK 100H。数据PROMPT1分贝在这里输入您的信息:$
PROMPT2分贝13,10,13,10,已加密/解密的消息:$a_tab DBZYXWVUTSRQPONMLKJIHGFEDCBA
l_tab DBzyxvwutsrqponmlkjihgfedcba
n_tab DB9876543210
BUFF 51分贝;允许的最大字符数(50)。
      DB? ;进入了用户的字符数。
      DB 51 DUP('$');输入的字符,截至BY CHR(13)。。code主要:
MOV AX,@data
MOV DS,AX;建立寻址LEA DX,PROMPT1;加载和打印字符串提示
MOV啊,9
INT 21H; CAPTURE STRING通过键盘(用BUFF格式)。
LEA DX,浅黄色
MOV啊,0AH,0AH REQUIRES BUFF的三级别的格式。
INT 21H; ------------------------------------------------- -------------------
;使SI为指向第一捕获的。
LEA SI,BUFF
INC SI; NOWSI指向进入了用户的字符数。
INC SI; NOWSI分排名第一输入的字符。encryptmessage:
MOV人,[SI];获得字符。
CMP人,32;检查是否空白
JE空间
CMP人,13;检查结束时达到。
JE加密CMP人,'Z' - 'A'
JBE大写CMP人,'Z' - '一'
JBE小写CMP人,'9' - '0'
JBE号大写字母:
MOV BX,偏移a_tab
子人,'A'; ENCRYPT CHARACTER小写:
MOV BX,偏移l_tab
子人,'A'; ENCRYPT CHARACTER数:
MOV BX,偏移n_tab
子人,'0'; ENCRYPT NUMBERXLAT
空间:
MOV [SI],AL;放字符退。
INC SI;下一个字符。
JMP encryptmessage
加密:LEA DX,PROMPT2
MOV啊,9
INT 21HLEA DX,浅黄色
加入DX,2
MOV啊,9
INT 21HMOV啊,4路
INT 21H最终主


解决方案

在这里比较简单的方法是通过尊重字符的ASCII顺序。先来的数字,然后来了大写字母和最后来的小写字符。它们之间的孔不需要翻译,因此它们被视为空间。您不再需要检查32 separatedly。

  encryptmessage:
  MOV人,[SI];获得字符。
  CMP人,13;检查结束时达到。
  JE加密  CMP人,0
  JB空间
  CMP人,'9'
  JBE号码
  CMP人,'A'
  JB空间
  CMP人,'Z'
  JBE大写
  CMP人,'A'
  JB空间
  CMP人,'Z'
  JA空间
小写:
  MOV BX,偏移l_tab
  子等,一个
  JMP翻译
大写字母:
  MOV BX,偏移a_tab
  子人,'A'
  JMP翻译
数:
  MOV BX,偏移n_tab
  子等,0
翻译:
  XLAT
空间:
  MOV [SI],AL;放字符退。
  INC SI;下一个字符。
  JMP encryptmessage
加密:

在程序结束打印加密的消息,但考虑如果用户输入的确实50个字符会发生什么!端接CR将不再其次是强制性的 $ 字符。我可能会建议你用1个字节缓冲放大。

 的buff 51分贝;允许的最大字符数(50)。
      DB? ;进入了用户的字符数。
      DB 51 DUP('$');输入的字符,截至BY CHR(13)。
      DB$

I have been trying to get this code to work for a while now. I am having trouble seeing how to use 3 lookup tables. Can someone point out what I'm doing wrong and point me in the right direction. I am trying to compare so i can use the upper, lower, and number. I can't find much on multiple lookup tables. Thank you very much for any help provided.

 .model small

.stack 100h

.data

prompt1 db "ENTER YOUR MESSAGE HERE: $" 
prompt2 db 13,10,13,10,"ENCRYPTED/DECRYPTED MESSAGE: $"

a_tab db "ZYXWVUTSRQPONMLKJIHGFEDCBA"
l_tab db "zyxvwutsrqponmlkjihgfedcba"
n_tab db "9876543210"


buff  db 51          ;MAXIMUM NUMBER OF CHARACTERS ALLOWED (50).
      db ?           ;NUMBER OF CHARACTERS ENTERED BY USER.
      db 51 dup('$') ;CHARACTERS ENTERED, ENDED BY CHR(13).

.code

main:
mov ax, @data
mov ds, ax                      ; set up addressability

lea dx, prompt1                 ; load and print the string PROMPT
mov ah, 9
int 21h

;CAPTURE STRING FROM KEYBOARD (WITH "BUFF" FORMAT).
lea dx, buff
mov ah, 0AH ;0AH REQUIRES THE THREE-LEVEL FORMAT OF BUFF.
int 21h

;--------------------------------------------------------------------    
;MAKE "SI" TO POINT TO FIRST CAPTURED CHARACTER.
lea si, buff
inc si ;NOW "SI" POINTS TO THE NUMBER OF CHARACTERS ENTERED BY USER.
inc si ;NOW "SI" POINTS TO FIRST ENTERED CHARACTER.



encryptmessage:
mov al, [si]        ;GET CHARACTER.
cmp al, 32          ;check if blank space
je space


cmp al, 13          ;CHECK IF END REACHED.
je  encrypted

cmp al, 'Z'-'A'
jbe uppercase

cmp al, 'z'-'a'
jbe lowercase

cmp al, '9'-'0'
jbe number

uppercase:
mov bx, offset a_tab
sub al, 'A'         ;ENCRYPT CHARACTER

lowercase:
mov bx, offset l_tab
sub al, 'a'         ;ENCRYPT CHARACTER

number:
mov bx, offset n_tab
sub al, '0'         ;ENCRYPT NUMBER

xlat 
space:
mov [si], al        ;PUT CHARACTER BACK.
inc si              ;NEXT CHARACTER.
jmp encryptmessage
encrypted:   



lea dx, prompt2
mov ah, 9
int 21h

lea dx, buff
add dx, 2
mov ah, 9
int 21h

mov ah, 4cH
int 21h

end main

解决方案

The easiest way to compare here is by respecting the ASCII order of the characters. First come the numbers, then come the uppercase characters and last come the lowercase characters. The holes between them need not be translated and thus they are treated as space. You no longer need to check for 32 separatedly.

encryptmessage:
  mov al, [si]        ;GET CHARACTER.
  cmp al, 13          ;CHECK IF END REACHED.
  je  encrypted

  cmp al, '0'
  jb  Space
  cmp al, '9'
  jbe Number
  cmp al, 'A'
  jb  Space
  cmp al, 'Z'
  jbe Uppercase
  cmp al, 'a'
  jb  Space
  cmp al, 'z'
  ja  Space
Lowercase:
  mov bx, offset l_tab
  sub al, 'a'
  jmp Translate
Uppercase:
  mov bx, offset a_tab
  sub al, 'A'
  jmp Translate
Number:
  mov bx, offset n_tab
  sub al, '0'
Translate:
  xlat 
Space:
  mov [si], al        ;PUT CHARACTER BACK.
  inc si              ;NEXT CHARACTER.
  jmp encryptmessage
encrypted: 

At the conclusion of your program you print the encrypted message but consider what would happen if the user indeed inputted 50 characters! The terminating CR would no longer be followed by the mandatory $ character. Might I suggest you enlarge the buffer by 1 byte.

buff  db 51          ;MAXIMUM NUMBER OF CHARACTERS ALLOWED (50).
      db ?           ;NUMBER OF CHARACTERS ENTERED BY USER.
      db 51 dup('$') ;CHARACTERS ENTERED, ENDED BY CHR(13).
      db '$'

这篇关于XLAT 3个查找表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆