调用printf时无效使用寄存器

时间:2016-02-23 07:14:43

标签: assembly x86 cpu-registers

我的代码:

.386
.model small,c
.stack 1000h

.data
msg     db  34h


.code
includelib MSVCRT
extrn printf:near
extrn exit:near

public main
main proc

         push offset msg
         call printf
         mov al, 0fh       ; hex=0fh=dec15  
         mov bl, 0eh      ; hex=0eh=dec14
         add bl, al
         push offset bl
         call printf         
         push 0
         call exit
main endp

end main
  • 我已成功使用第一个4打印prinf
  • 然后我分别将15和14移动到al和bl。
  • 然后我使用add添加它们并将结果存储在bl
  • 现在我要打印答案(存储在bl
  • 每当我尝试使用printf时都会出错:

      

    错误A2032:无效使用寄存器

我尝试了什么:

  • mov bl,eax然后打印
  • mov eax,bl然后打印
  • 直接打印bl

然后我终于尝试了这个:

mov al,3 ;print ♥
mov dl,al
mov ah,76
int 21h ;call interrupt

一切都失败了。

任何帮助都将不胜感激。

编辑:我在x86

EDIT2:经过一番研究,我终于能够完成这项工作了:

这是我的新代码:

.386
.model flat,stdcall
option casemap:none

.data
msg     dd  34h
fmt    db "Value is : %d", 0

.data?
retvalue dd ?

.code
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
includelib MSVCRT
extrn printf:near
extrn exit:near

public main
main proc

         ;push offset msg
         ;call printf
         mov eax, 1Eh       ; Decimal=30
         mov ecx, 1Eh     ; Decimal=30
         add eax, ecx
         mov retvalue,eax
         push offset retvalue
         push offset fmt
         call printf 
      push 0
         call exit
main endp

end main

问题是最终的printf会打印出垃圾编号:

这是输出:Value is : 4206612

预期输出:Value is : 60

0 个答案:

没有答案