2015-06-20 73 views
0

我真的很陌生,我正在学习用自己和班级学习的东西。所以,我的目标是显示一个存储在寄存器中的数字。当我运行程序时,它显示数字的字符值,所以如果我要显示数字本身,我会如何做到这一点。这是我的代码,请告诉我我犯了什么错误。到目前为止,我们已经在汇编中学习了移动指令和其他一些基本的东西。如何使用fasm汇编器打印出一个数字?

#fasm# 

mov ah,2 

mov bh,66 
add bh,1 

mov dl,bh 


int 21h 
int 20h 
+0

您必须将您的号码转换为文本。大量的例子。对于2位数字,只需除以10,并通过加上“0”('48')将商和余数转换为ascii。 – Jester

+0

'ah = 2'的int 21h'不显示'dl'中的*号码*。它显示“dl”中的*字符*,这意味着它假定它是一个ASCII编码的字符。根据[ASCII表](http://www.asciitable.com/),如果你在'dl'中有'67',那么你可能看到一个字符'C'显示。 – lurker

+0

@Jester: - 谢谢你的建议。我在线扫描fasm汇编器上的教程,但找不到任何。然后,我看着这个家伙的教程,他正在使用8086汇编程序,我在我的fasm汇编程序中尝试了他的代码,它工作正常。我不知道这是否是正确的做法,或者我是否必须坚持那些如此有限的枯燥的讲师笔记。这是他在教程中用来显示字符输入的代码。他在8086汇编写的,我试图在FASM如下: - #FASM# 组织100H MOV啊,1H INT 21H MOV DL,人 MOV啊,2H INT 21H INT 20H – Melissa

回答

0
use16 ;generate 16bit opcodes 
org 0100h ;code offset for .COM program 

mov ax,1976 ;ax = number to display 

xor cx,cx ;cx = count = 0 
mov bx,10 ;bx = number base = 10 
.stack: 
xor dx,dx ;dx:ax for div 
div bx ;dx:ax = dx:ax div base 
add dx,'0' ;dx into ascii 
push dx ;stack it 
inc cx ;increment counter 
test ax,ax ;do again if not 0 
jnz .stack 
mov ah,02h ;DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT 
.write: 
pop dx ;unstack it 
int 21h ;write 
loop .write ;for each in count 

mov ah,08h ;DOS 1+ - CHARACTER INPUT WITHOUT ECHO 
int 21h ;read 

int 20h ;DOS 1+ - TERMINATE PROGRAM 
+0

代码只有答案很难使用。请解释这段代码的作用。至少*这是用于执行此操作的.com程序的汇编代码... * –

0

您可以使用Win32 API的(如下图所示)。我建议你去搜索Iczelion教程。他们在MASM。 FASM Iczelion示例为here


format PE GUI 4.0 
entry start 

; macros for `invoke`, `cinvoke`, ... 
include 'win32ax.inc' 

; code section 
section '.text' code readable writable executable 
    ; text buffer for the number to display 
    buffer rb 64 ; 64 bytes 

    ; program start 
    start: 

    ; our number 
    mov  eax, 1234 

    ; printing EAX to buffer 
    cinvoke wsprintf, buffer, '%d', eax 

    ; terminate string with zero 
    mov  [buffer + eax], 0 

    ; showing message 
    invoke MessageBox, 0, buffer, 'result', MB_OK 

    ; calling exit 
    invoke ExitProcess, 0 

section '.idata' import readable writable 
    library kernel32, 'KERNEL32.DLL',\ 
       user32, 'USER32.DLL' 

    include 'api\kernel32.inc' 
    include 'api\user32.inc'