Advertisement
Guest User

Real-mode Integer Converter

a guest
Feb 16th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; AX: converted integer.
  2. ; DX: where it stopped reading.
  3. ; DX=0 and AX!=0xFFFF indicate reading error.
  4. ; DX=0 and AX==0xFFFF indicate overflow error.
  5. ; unsigned long str2int(const char* str, int base, int bSigned);
  6. str2int:
  7.     push bp
  8.     mov bp, sp
  9.     sub sp, 2
  10.     push cx
  11.     push bx
  12.     push si
  13.  
  14.     mov si, [bp+4]
  15.     mov bx, [bp+6]
  16.     cmp bx, 2
  17.     jl .fail
  18.     cmp bx, 36
  19.     jg .fail
  20.     push si
  21.     call skipSpace
  22.     mov si, ax
  23.     xor cx, cx
  24.     xor ax, ax
  25.  
  26.     mov [bp-2], ax
  27.     mov cl, [si]
  28.     cmp cl, '-'
  29.     jne .notMinus
  30.         cmp word [bp+8], 0
  31.         je .notMinus
  32.         mov word [bp-2], 1
  33.         inc si
  34.     .notMinus:
  35.     mov cl, [si]
  36.     cmp cl, '0'
  37.     jb .fail
  38.     cmp cl, '9'
  39.     jbe .isDigit
  40.     cmp cl, 'z'
  41.     ja .fail
  42.     cmp cl, 'a'
  43.     jae .isLower
  44.     cmp cl, 'A'
  45.     jb .fail
  46.     cmp cl, 'Z'
  47.     ja .fail
  48.     jmp .isUpper
  49. .loop:
  50.     mov cl, [si]
  51.     cmp cl, '0'
  52.     jb .notDigit
  53.     cmp cl, '9'
  54.     ja .notDigit
  55. .isDigit:
  56.         sub cl, '0'
  57.         jmp .continue
  58.     .notDigit:
  59.     cmp cl, 'A'
  60.     jb .notUpper
  61.     cmp cl, 'Z'
  62.     ja .notUpper
  63. .isUpper:
  64.         sub cl, 'A'
  65.         add cl, 10
  66.         jmp .continue
  67.     .notUpper:
  68.     cmp cl, 'a'
  69.     jb .break
  70.     cmp cl, 'z'
  71.     ja .break
  72. .isLower:
  73.         sub cl, 'a'
  74.         add cl, 10
  75. .continue:
  76.     cmp cl, bl
  77.     jae .break
  78.  
  79.     mul bx
  80.     or dx, dx
  81.     jnz .overflow
  82.     add ax, cx
  83.     jc .overflow
  84.     inc si
  85.     jmp .loop
  86. .break:
  87.     cmp word [bp-2], 0
  88.     je .notNeg
  89.         test ax, 0x8000
  90.         jnz .overflow
  91.         neg ax
  92.     .notNeg:
  93.     sub si, [bp+4]
  94.     mov dx, si
  95.     jmp .done
  96. .overflow:
  97.     mov ax, 0xFFFF
  98.     xor dx, dx
  99.     jmp .done
  100. .fail:
  101.     xor ax, ax
  102.     xor dx, dx
  103. .done:
  104.     pop si
  105.     pop bx
  106.     pop cx
  107.     add sp, 2
  108.     pop bp
  109.     ret 6
  110.  
  111. ; "buffer" must be large enough to fit.
  112. ; int int2str(char* buffer, int num, int base, int bSigned);
  113. int2str:
  114.     push bp
  115.     mov bp, sp
  116.     push bx
  117.     push si
  118.     push di
  119.  
  120.     mov di, [bp+4]
  121.     mov ax, [bp+6]
  122.     mov bx, [bp+8]
  123.     cmp bx, 2
  124.     jl .fail
  125.     cmp bx, 36
  126.     jg .fail
  127.     cmp word [bp+10], 0
  128.     je .loop
  129.         cmp ax, 0
  130.         jge .loop
  131.         mov byte [di], '-'
  132.         inc di
  133.         neg ax
  134. .loop:
  135.     xor dx, dx
  136.     div bx
  137.     mov si, .digits
  138.     add si, dx
  139.     mov dl, [si]
  140.     mov [di], dl
  141.     inc di
  142.     or ax, ax
  143.     jnz .loop
  144.  
  145.     mov byte [di], 0
  146.     mov di, [bp+4]
  147.     cmp byte [di], '-'
  148.     jne .notNeg
  149.         inc di
  150.     .notNeg:
  151.     push di
  152.     call strrev
  153.     mov ax, 1
  154.     jmp .done
  155. .fail:
  156.     xor ax, ax
  157. .done:
  158.     pop di
  159.     pop si
  160.     pop bx
  161.     pop bp
  162.     ret 8
  163.  
  164. ; void strrev(char* str);
  165. strrev:
  166.     push bp
  167.     mov bp, sp
  168.     push cx
  169.     push si
  170.     push di
  171.  
  172.     mov cx, 0xFFFF
  173.     mov si, [bp+4]
  174.     mov di, si
  175.     xor ax, ax
  176.     repne scasb
  177.     sub di, 2
  178. .loop:
  179.     cmp si, di
  180.     jae .done
  181.     mov al, [di]
  182.     mov ah, [si]
  183.     mov [di], ah
  184.     mov [si], al
  185.     inc si
  186.     dec di
  187.     jmp .loop
  188.  
  189. .done:
  190.     pop di
  191.     pop si
  192.     pop cx
  193.     pop bp
  194.     ret 2
  195.  
  196. ; const char* skipSpace(const char* str);
  197. skipSpace:
  198.     push bp
  199.     mov bp, sp
  200.     push si
  201.  
  202.     mov si, [bp+4]
  203. .loop:
  204.     mov al, [si]
  205.     or al, al
  206.     jz .done
  207.     cmp al, ' '
  208.     ja .done
  209.     inc si
  210.     jmp .loop
  211. .done:
  212.     mov ax, si
  213.  
  214.     pop si
  215.     pop bp
  216.     ret 2
  217.  
  218.  
  219. int2str.digits: db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement