2015-11-09 8 views
2

Я пишу программу MASM, используя библиотеку Irvine32 из моего учебника. Я хочу выстроить свои печатные столбцы, но я не смог найти ничего о том, как завершить строку с помощью tab-stop, /t для C/C++, поэтому я сделал процедуру, которая определяет, сколько десятичных знаков имеет число и назначает строковая переменная spacer.Перемещение строки между переменными

Моя проблема заключается в том, чтобы попытаться присвоить новую строку, я получаю ошибки сборки. Я попытался

mov spacer, "New String",0 

и

mov spacer, "New String" 

, а также присвоение "New String" переменной и присвоения spacer этой переменной, а также, что переменные OFFSET. У меня теперь есть, где переменные OFFSET перемещены в edx, но я не могу переместить edx в другую переменную.

Я был бы очень признателен за помощь и любую информацию, чтобы помочь лучше понять, почему это не работает в сборке или в MASM в частности. Благодаря

Процедура в вопросе:

; Define the spacer based on the places in x 
spacer_choice proc 

    cmp x, 10 
    JB SC1 

    cmp x, 100 
    JB SC2 

    mov edx, OFFSET hundo_spacer 
    JMP SC3 

    SC1: 
     mov edx, OFFSET one_spacer 
     JMP SC3 

    SC2: 
     mov edx, OFFSET ten_spacer 
     JMP SC3 

    SC3: 
     mov spacer, OFFSET edx 
     RET 
spacer_choice endp 

Выход:

1>------ Build started: Project: MASM4, Configuration: Debug Win32 ------ 
1> Assembling composite.asm... 
1>composite.asm(209): error A2032: invalid use of register 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\masm.targets(50,5): error MSB3721: The command "ml.exe /c /nologo /Sg /Zi /Fo"Debug\composite.obj" /Fl"MASM4.lst" /I "c:\Irvine" /W3 /errorReport:prompt /Tacomposite.asm" exited with code 1. 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Полный код:

INCLUDE Irvine32.inc 

.data 
; ----- GLOBALS 
n_comps DWORD ? 


; ----- INTRO VALUES 
; Greeting the User 
title_prompt BYTE "Welcome to Prog. 4, my name is Zach", 10, 13, 0 
name_prompt BYTE "What should I call you?: ", 0 
username BYTE 21 DUP(0) 
user_greet BYTE "Hello, ", 0 
; Instructing the User 
one_instruct BYTE "We are going to calculate all the composite numbers from 1 to n.", 10, 13, 0 
two_instruct BYTE "N is the number you enter. That number has to be an integer,", 10, 13, 0 
three_instruct BYTE "and in the range of 1 to 400.", 10, 13, 0 


; ----- INPUT VALUES 
; Prompts 
int_prompt BYTE "How many composite numbers do you want to display? 1 to 400: ", 0 
bad_prompt BYTE "Your Input was bad, try again", 10, 13, 0 
; Constants 
MAX_VAL = 400 
MIN_VAL = 1 


; ----- CALCULATE 
x DWORD ? 
spacer BYTE ? 
count DWORD ? 


; ----- SPACER_CHOICE 
one_spacer BYTE ",  ", 0 
ten_spacer BYTE ", ", 0 
hundo_spacer BYTE ", ", 0 


; ----- OUTRO 
farewell BYTE "Hope you've had fun printing composites! Goodbye, ", 0 

.code 
main proc 

    call intro 

    call input 

    call calculate 

    call outro 

    invoke ExitProcess, 0 
main endp 

; Greet the User and get their name 
intro proc 

    ; Greet 
    mov edx, OFFSET title_prompt 
    call WriteString 

    ; Prompt for username 
    mov edx, OFFSET name_prompt 
    call WriteString 
    mov edx, OFFSET username 
    mov ecx, SIZEOF username 
    call ReadString 
    mov edx, OFFSET user_greet 
    call WriteString 
    mov edx, OFFSET username 
    call WriteString 
    call Crlf 


    ; Intruct the User 
    mov edx, OFFSET one_instruct 
    call WriteString 
    mov edx, OFFSET two_instruct 
    call WriteString 
    mov edx, OFFSET three_instruct 
    call WriteString 
intro endp 


; Get User's Input. Validate if Between Min and Max 
input proc 

    ; Prompt for user input 
    I1: 
     mov edx, OFFSET int_prompt 
     call WriteString 
     mov eax, 0 
     call ReadInt 
     call Crlf 


     ; Check if less than MAX_VAL 
     cmp eax, MAX_VAL 
     JA I4 
     JMP I3 


     I3: 
      ; Check if greater than MIN_VAL 
      cmp eax, MIN_VAL 
      JB I4 
      JMP I2 


     I4: 
      ; EAX is incorrect 
      ; Loop 
      mov edx, OFFSET bad_prompt 
      call WriteString 
    loop I1 

    ; Good Input 
    ; Set n_comps to eax 
    I2: 
     mov n_comps, eax 
     mov eax, 0 
    RET 
input endp 


; X is not divisible by 2 or 3, is prime 
calculate proc 

    mov ecx, 400 
    mov x, 1 

    C1: 
     ; Check if X is less than, or equal to, 3 
     cmp x, 3 
     JBE C2 

     C4: 
      ; Check if X is divisible by 2 
      mov edx, 0 
      mov eax, x 
       mov ebx, 2 
      div ebx 
      cmp edx, 0 
      JE C3 

      ; Check if X is divisible by 3 
      mov edx, 0 
      mov eax, x 
       mov ebx, 3 
      div ebx 
      cmp edx, 0 
      JNE C2 

     C3: 
      ; Is composite, Print number 
      mov eax, x 
      cmp count, 10 
      JNE C5 

      call Crlf 
      mov count, 0 

      C5: 
       call WriteInt 
       call spacer_choice 
       mov edx, OFFSET spacer 
       call WriteString 
       add count, 1 

     C2: 
      ; RET if X == N 
      mov eax, n_comps 
      cmp x, eax 
      JNE C6 

      RET 

      C6: 
       ; Increment and LOOP 
       add x, 1 
      LOOP C1 
calculate endp 


; Define the spacer based on the places in x 
spacer_choice proc 

    cmp x, 10 
    JB SC1 

    cmp x, 100 
    JB SC2 

    mov edx, OFFSET hundo_spacer 
    JMP SC3 

    SC1: 
     mov edx, OFFSET one_spacer 
     JMP SC3 

    SC2: 
     mov edx, OFFSET ten_spacer 
     JMP SC3 

    SC3: 
     mov spacer, OFFSET edx 
     RET 
spacer_choice endp 


; Say Goodbye 
outro proc 

    mov edx, OFFSET farewell 
    call WriteString 
    mov edx, OFFSET username 
    call WriteString 
    call Crlf 
outro endp 

end main 

ответ

1

Я добавил горизонтальную вкладку ASCII, 9, до конца распорки, и это устранило необходимость в процедуре spacer_choice.

Spacer теперь объявлен как: spacer BYTE ",", 9, 0