간단한 어셈블리 프로그래밍 질문 드립니다
글쓴이: mkdi123 / 작성시간: 일, 2017/05/14 - 5:15오후
%include "asm_io.inc" segment .data prompt1 db "Enter a number (A) : ", 0 ; prompt2 db "Enter a number (B) : ", 0 ; initialized data is put in the data segment here outmsg1 db "A X B = ", 0 segment .bss input1 resb 0 input2 resb 1 result resb 2 segment .text global main main enter 0,0 ; setup stack frame pusha mov eax, prompt1 ; call print_string ; code is put in the text segment. Do not modify the code before call read_int ; or after this comment. mov [input1], eax ; mov eax, prompt2 call print_string call read_int mov [input2], eax mov ecx, [input2] while: add eax, [input1] add [result], eax sub ecx, 1 JECXZ while mov eax, outmsg1 call print_string mov eax, [result] call print_int call print_nl popa mov eax, 0 ; return value leave ; leave stack frame ret
두 수를 입력받아서 덧셈을 반복하는 식으로 곱을 계산하는 아주 간단한 문제입니다.
컴파일은 되는데 출력하면 값이 제대로 출력되지 않습니다ㅠㅠ
Forums:


컴파일은 되는데 값이 제대로 출력되지 않는 이유는
컴파일은 되는데 값이 제대로 출력되지 않는 이유는 수도 없이 많을 수 있죠.
그 이전에, 아래 루프가 대체 뭘 하고 있는 건지 라인 단위로 해석해서 설명해보세요. 그러면 원인을 아시게 될 겁니다.
call print_int, call print
call print_int, call print_string 은 뭔가요? 정체불명 사제 라이브러리에 있는 코드를 call하는 것으로 보이는데 이런건 인수넘기는법, 반환값, 뭐하는지를 알아야 답줄수 있습니다. 경우에 따라서는 사제 라이브러리의 버그로 안돌 수 있고요.
어셈블리에서 레지스터나 메모리 값 텍스트 출력 그냥 안됩니다.
2진수 숫자를 화면에 표시할려는 진법의 숫자대로 ASCII코드 전환작업해서 출력할 string(다 만든뒤 마지막에 0 추가)을 만든 뒤에 보통은 OS에서 제공하는 텍스트 출력 서비스를 이용해서 출력 합니다. OS의 서비스 안쓰고 직접 하겠다면 비디오메모리 조작, GUI환경일때는 폰트를 이용한 drawing까지 파야 합니다.
Written By the Black Knight of Destruction