간단한 어셈블리 프로그래밍 질문 드립니다
글쓴이: 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
댓글 달기